## RNA-seq analysis with DESeq2
##Parts of this script are also based off of the bioconductor page:
##http://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html
##https://bioconductor.org/packages/release/workflows/vignettes/rnaseqGene/inst/doc/rnaseqGene.html
##referenced 2.3.20
## Stephen Turner, @genetics_blog
##https://gist.github.com/stephenturner/f60c1934405c127f09a6#file-deseq2-analysis-template-r
##downloaded 2.3.2020
#Code written by Mike Sportiello. Michael_sportiello@urmc.rochester.edu
# Import data from featureCounts
countdata <- read.table("rawcounts.stim.5.13.20.txt", header=TRUE, row.names=1)

# Convert to matrix
countdata <- as.matrix(countdata)
head(countdata)
              L1_CD103 L2_CD103 L3_CD103 L1_DP L2_DP L3_DP L1_DN L2_DN L3_DN L2_CD49a L3_CD49a
RP23-271O17.1        0        0        0     0     0     0     0     0     0        0        0
Gm26206              0        0        0     0     0     0     0     0     0        0        0
Xkr4                 0        0        0     0     0     0     0     0     0        0        0
RP23-317L18.1        0        0        0     0     0     0     0     0     0        0        0
RP23-317L18.4        0        0        0     0     0     0     0     0     0        0        0
RP23-317L18.3        0        0        0     0     0     0     0     0     0        0        0
# Assign conditions
(condition <- factor(c(rep("CD103", 3), rep("DP", 3), rep("DN",3), rep("CD49a",2))))
 [1] CD103 CD103 CD103 DP    DP    DP    DN    DN    DN    CD49a CD49a
Levels: CD103 CD49a DN DP
#load libraries
library(DESeq2)
Loading required package: S4Vectors
Loading required package: stats4
Loading required package: BiocGenerics
Loading required package: parallel

Attaching package: 㤼㸱BiocGenerics㤼㸲

The following objects are masked from 㤼㸱package:parallel㤼㸲:

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ, clusterExport, clusterMap, parApply,
    parCapply, parLapply, parLapplyLB, parRapply, parSapply, parSapplyLB

The following objects are masked from 㤼㸱package:stats㤼㸲:

    IQR, mad, sd, var, xtabs

The following objects are masked from 㤼㸱package:base㤼㸲:

    anyDuplicated, append, as.data.frame, basename, cbind, colnames, dirname, do.call, duplicated,
    eval, evalq, Filter, Find, get, grep, grepl, intersect, is.unsorted, lapply, Map, mapply,
    match, mget, order, paste, pmax, pmax.int, pmin, pmin.int, Position, rank, rbind, Reduce,
    rownames, sapply, setdiff, sort, table, tapply, union, unique, unsplit, which.max, which.min


Attaching package: 㤼㸱S4Vectors㤼㸲

The following object is masked from 㤼㸱package:base㤼㸲:

    expand.grid

Loading required package: IRanges

Attaching package: 㤼㸱IRanges㤼㸲

The following object is masked from 㤼㸱package:grDevices㤼㸲:

    windows

Loading required package: GenomicRanges
Loading required package: GenomeInfoDb
Loading required package: SummarizedExperiment
Loading required package: MatrixGenerics
Loading required package: matrixStats

Attaching package: 㤼㸱MatrixGenerics㤼㸲

The following objects are masked from 㤼㸱package:matrixStats㤼㸲:

    colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse, colCounts, colCummaxs, colCummins,
    colCumprods, colCumsums, colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs, colMads,
    colMaxs, colMeans2, colMedians, colMins, colOrderStats, colProds, colQuantiles, colRanges,
    colRanks, colSdDiffs, colSds, colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads,
    colWeightedMeans, colWeightedMedians, colWeightedSds, colWeightedVars, rowAlls, rowAnyNAs,
    rowAnys, rowAvgsPerColSet, rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods,
    rowCumsums, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps, rowMadDiffs, rowMads, rowMaxs,
    rowMeans2, rowMedians, rowMins, rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks,
    rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars, rowWeightedMads,
    rowWeightedMeans, rowWeightedMedians, rowWeightedSds, rowWeightedVars

Loading required package: Biobase
Welcome to Bioconductor

    Vignettes contain introductory material; view with 'browseVignettes()'. To cite Bioconductor,
    see 'citation("Biobase")', and for packages 'citation("pkgname")'.


Attaching package: 㤼㸱Biobase㤼㸲

The following object is masked from 㤼㸱package:MatrixGenerics㤼㸲:

    rowMedians

The following objects are masked from 㤼㸱package:matrixStats㤼㸲:

    anyMissing, rowMedians
library(dendextend)

---------------------
Welcome to dendextend version 1.15.1
Type citation('dendextend') for how to cite the package.

Type browseVignettes(package = 'dendextend') for the package vignette.
The github page is: https://github.com/talgalili/dendextend/

Suggestions and bug-reports can be submitted at: https://github.com/talgalili/dendextend/issues
Or contact: <tal.galili@gmail.com>

    To suppress this message use:  suppressPackageStartupMessages(library(dendextend))
---------------------


Attaching package: 㤼㸱dendextend㤼㸲

The following object is masked from 㤼㸱package:stats㤼㸲:

    cutree
#create dendrogram of samples
dist <- dist(t(countdata), method="euclidean")
cluster <- hclust(dist)
dend <- as.dendrogram(cluster)
dend <- hang.dendrogram(dend, hang=-1) #Leaves at same height
dend <- set(dend, "branches_lwd", 2) #Thick branches
dend <- set(dend, "labels_cex", 1) #label font size
#Plot the dendrogram
par(mar = c(10,5,3,1))
plot(dend, main = "Sample Clustering on stimulated samples\ndist.method=Eucleadian", ylab = "Height") 

# Create a coldata frame and instantiate the DESeqDataSet. See ?DESeqDataSetFromMatrix
(coldata <- data.frame(row.names=colnames(countdata), condition))
dds <- DESeqDataSetFromMatrix(countData=countdata, colData=coldata, design= ~ condition)
dds
class: DESeqDataSet 
dim: 53733 11 
metadata(1): version
assays(1): counts
rownames(53733): RP23-271O17.1 Gm26206 ... AC234645.1 AC149090.1
rowData names(0):
colnames(11): L1_CD103 L2_CD103 ... L2_CD49a L3_CD49a
colData names(1): condition
# Begin the DESeq pipeline
dds <- DESeq(dds)
estimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
resultsNames(dds)
[1] "Intercept"                "condition_CD49a_vs_CD103" "condition_DN_vs_CD103"    "condition_DP_vs_CD103"   
#Dispersions
#Plotting the dispersion estimates is a useful diagnostic. The dispersion plot below is typical, with the final estimates shrunk from the gene-wise estimates towards the fitted estimates. Some gene-wise estimates are flagged as outliers and not shrunk towards the fitted value, (this outlier detection is described in the manual page for estimateDispersionsMAP). The amount of shrinkage can be more or less than seen here, depending on the sample size, the number of coefficients, the row mean and the variability of the gene-wise estimates.
#load colors for future plots
library(viridis)
Loading required package: viridisLite
viridispal4<- viridis(n=4)
#plot dispersion plots
plotDispEsts(dds, main="Dispersion plot", genecol='#440154FF',finalcol='#21908CFF',fitcol='#FDE725FF')

# Regularized log transformation for clustering/heatmaps, etc
library(ggplot2)
rld <- rlogTransformation(dds)
head(assay(rld))
              L1_CD103 L2_CD103 L3_CD103 L1_DP L2_DP L3_DP L1_DN L2_DN L3_DN L2_CD49a L3_CD49a
RP23-271O17.1        0        0        0     0     0     0     0     0     0        0        0
Gm26206              0        0        0     0     0     0     0     0     0        0        0
Xkr4                 0        0        0     0     0     0     0     0     0        0        0
RP23-317L18.1        0        0        0     0     0     0     0     0     0        0        0
RP23-317L18.4        0        0        0     0     0     0     0     0     0        0        0
RP23-317L18.3        0        0        0     0     0     0     0     0     0        0        0
#plot histogram of this transformed data
hist(assay(rld),col='#440154FF')

library("FactoMineR")
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
library("factoextra")
Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
#' @include utilities.R
NULL
NULL
#' Plot confidence ellipses.
#' @description Plot confidence ellipses around barycenters. The method for
#'   computing confidence ellipses has been modified from \code{FactoMineR::coord.ellipse()}.
#' @inheritParams ggplot2::layer
#' @inheritParams ggplot2::stat_ellipse
#' @param level confidence level used to construct the ellipses. By
#'   default, 0.95.
#' @param npoint number of points used to draw the ellipses.
#' @param bary logical value. If TRUE, the coordinates of the ellipse around the
#'   barycentre of individuals are calculated.
#' @seealso \code{\link{stat_conf_ellipse}}
#' @examples
#' # Load data
#' data("mtcars")
#' df <- mtcars
#' df$cyl <- as.factor(df$cyl)
#'
#' # scatter plot with confidence ellipses
#' ggscatter(df, x = "wt", y = "mpg", color = "cyl")+
#'  stat_conf_ellipse(aes(color = cyl))
#'
#' ggscatter(df, x = "wt", y = "mpg", color = "cyl")+
#'  stat_conf_ellipse(aes(color = cyl, fill = cyl), alpha = 0.1, geom = "polygon")
#'
#' @export
stat_conf_ellipse <- function(mapping = NULL, data = NULL, geom = "path",
                              position = "identity", na.rm = FALSE, show.legend = NA,
                              inherit.aes = TRUE, level = 0.95, npoint = 100, bary = TRUE,
                              ...) {
  layer(
    stat = StatConfEllipse, data = data, mapping = mapping, geom = geom,
    position = position, show.legend = show.legend, inherit.aes = inherit.aes,
    params = list(na.rm = na.rm,  level = level, npoint = npoint, bary = bary, ...)
  )
}


StatConfEllipse <- ggproto("StatConfEllipse", Stat,
                           required_aes = c("x", "y"),
                           
                           compute_group = function(data, scales, params, level = 0.95,
                                                    npoint = 100, bary = TRUE) {
                             
                             .coord_ellipse (data$x, data$y, level = level,
                                             npoint = npoint, bary = bary)
                           }
)

# Compute confidence ellipses.
#  x,y x and y variables for drawing.
#  level confidence level used to construct the ellipses. By
#   default, 0.95.
#  npoint number of points used to draw the ellipses.
#  bary logical value. If TRUE, the coordinates of the ellipse around the
#   barycentre of individuals are calculated.
.coord_ellipse <- function ( x, y, level = 0.95,
                             npoint = 100, bary = FALSE)
{
  
  .ellipse <- function(x, scale = c(1, 1), centre = c(0, 0),
                       level = 0.95, t = sqrt(stats::qchisq(level, 2)), which = c(1,
                                                                                  2), npoints = 100) {
    names <- c("x", "y")
    if (is.matrix(x)) {
      xind <- which[1]
      yind <- which[2]
      r <- x[xind, yind]
      if (missing(scale)) {
        scale <- sqrt(c(x[xind, xind], x[yind, yind]))
        if (scale[1] > 0)
          r <- r/scale[1]
        if (scale[2] > 0)
          r <- r/scale[2]
      }
      if (!is.null(dimnames(x)[[1]]))
        names <- dimnames(x)[[1]][c(xind, yind)]
    }
    else r <- x
    r <- min(max(r, -1), 1)
    d <- acos(r)
    a <- seq(0, 2 * pi, len = npoints)
    matrix(c(t * scale[1] * cos(a + d/2) + centre[1], t *
               scale[2] * cos(a - d/2) + centre[2]), npoints, 2,
           dimnames = list(NULL, names))
  }
  
  
  center <- c(mean(x, na.rm = TRUE), mean(y, na.rm = TRUE))
  tab <- data.frame(x = x, y = y)
  mat.cov <- stats::cov(tab)
  if (bary)
    mat.cov = mat.cov/nrow(tab)
  res <- .ellipse(mat.cov, centre = center, level = level, npoints = npoint)
  return(res)
}
#plot PCAs with confidence intervals
cbpal<-c("#acfafa",'#414141',"#f29737","#8744f6")
pca<-plotPCA(rld)
pca+scale_colour_viridis(discrete=T) + scale_color_manual(values = cbpal) +stat_conf_ellipse() +theme_bw()
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing
scale.

#plot pca loadings
rv <- rowVars(assay(rld))
select <- order(rv, decreasing=TRUE)[seq_len(min(500,length(rv)))]
subset <- assay(rld)[select, ]
pca <- prcomp(t(subset))


loadings <- as.data.frame(pca$rotation)
loadings$genes<-row.names(loadings)
loadings <- as.data.frame(pca$rotation)
loadings$genes<-row.names(loadings)

loadings<-loadings[order(-loadings$PC1),]
head(loadings)
princ1<-loadings[1:10,]
loadings<-loadings[order(loadings$PC1),]
princ1b<-loadings[1:10,]
head(princ1)
head(princ1b)
princ1<-rbind(princ1,princ1b)

loadings<-loadings[order(-loadings$PC2),]
head(loadings)
princ2<-loadings[1:10,]
loadings<-loadings[order(loadings$PC2),]
princ2b<-loadings[1:10,]
head(princ2)
head(princ2b)
princ2<-rbind(princ2,princ2b)

loadings<-loadings[order(-loadings$PC3),]
head(loadings)
princ3<-loadings[1:10,]
loadings<-loadings[order(loadings$PC3),]
princ3b<-loadings[1:10,]
head(princ3)
head(princ3b)
princ3<-rbind(princ3,princ3b)

#plots
pc1stim<-ggplot(princ1,aes(x=reorder(rownames(princ1),PC1),y=PC1,fill=sign(PC1)))+
  geom_col()+coord_flip()+
  scale_fill_viridis(option='plasma',begin = .2,end = .65)+
  theme(axis.title.y = element_blank())+
  theme(plot.title = element_text(color="black", size=14, face="bold",hjust = .5),
        axis.title = element_text(color='black'),
        axis.text = element_text(color='black'),
        text = element_text(face= 'bold',color='black'))+
 labs(title='PC1',y='PC1 Contribution')+
  theme(legend.position = 'none')
pc2stim<-ggplot(princ2,aes(x=reorder(rownames(princ2),PC2),y=PC2,fill=sign(PC2)))+geom_col()+coord_flip()+scale_fill_viridis(option='plasma',begin = .2,end = .65)+
    theme(axis.title.y = element_blank())+
  theme(plot.title = element_text(color="black", size=14, face="bold",hjust = .5),
        axis.title = element_text(color='black'),
        axis.text = element_text(color='black'),
        text = element_text(face= 'bold',color='black'))+
 labs(title='PC2',y='PC2 Contribution')+
  theme(legend.position = 'none')

pc3stim<-ggplot(princ3,aes(x=reorder(rownames(princ3),PC3),y=PC3,fill=sign(PC3)))+geom_col()+coord_flip()+scale_fill_viridis(option='plasma',begin = .2,end = .65)+
    theme(axis.title.y = element_blank())+
  theme(plot.title = element_text(color="black", size=14, face="bold",hjust = .5),
        axis.title = element_text(color='black'),
        axis.text = element_text(color='black'),
        text = element_text(face= 'bold',color='black'))+
 labs(title='PC3',y='PC3 Contribution')+
  theme(legend.position = 'none')

library(gridExtra)

Attaching package: 㤼㸱gridExtra㤼㸲

The following object is masked from 㤼㸱package:Biobase㤼㸲:

    combine

The following object is masked from 㤼㸱package:BiocGenerics㤼㸲:

    combine
gridpcloadings<-grid.arrange(pc1stim,pc2stim,pc3stim,nrow=1)


ggsave(file.path("./", paste0("pcloadings.integrinskept.", Sys.Date(), ".png")), plot = gridpcloadings, height = 4, width = 8, units = "in",dpi = 600)
##
  ## the contribution to the total variance for each component
     percentVar <- 100*(pca$sdev^2 / sum( pca$sdev^2 ))
     scree_plot=data.frame(percentVar)
     scree_plot[,2]<- c(1:11)
     colnames(scree_plot)<-c("Variance","component_number")
     scree_plot$component_number <- factor(scree_plot$component_number, levels = c(1:12),labels = paste0('PC', c(1:12)))
    pcscree<- ggplot(scree_plot, mapping=aes(x=component_number, y=Variance))+       
       geom_bar(stat="identity")+
       labs(x='Component Number')+
       theme(
         plot.title = element_text(color="black", size=14, face="bold",hjust = .5),
        axis.title = element_text(color='black'),
        axis.text = element_text(color='black'),
        text = element_text(face= 'bold',color='black'))
     pcscree
     ggsave(file.path("./", paste0("pcscree.integrinskept.", Sys.Date(), ".png")), plot = pcscree, height = 3, width = 8, units = "in",dpi = 600)

# Colors for plots below
library(RColorBrewer)
(mycols <- brewer.pal(8, "Dark2")[1:length(unique(condition))])
[1] "#1B9E77" "#D95F02" "#7570B3" "#E7298A"
mycols3 <-colorspace::sequential_hcl(5, "grays")
# Sample distance heatmap
sampleDists <- as.matrix(dist(t(assay(rld))))
library(gplots)

Attaching package: 㤼㸱gplots㤼㸲

The following object is masked from 㤼㸱package:IRanges㤼㸲:

    space

The following object is masked from 㤼㸱package:S4Vectors㤼㸲:

    space

The following object is masked from 㤼㸱package:stats㤼㸲:

    lowess
library(viridis)
head(sampleDists)
         L1_CD103 L2_CD103 L3_CD103    L1_DP    L2_DP    L3_DP    L1_DN    L2_DN    L3_DN L2_CD49a L3_CD49a
L1_CD103  0.00000 41.17115 36.82388 73.54279 78.93084 71.86303 45.80671 53.75376 46.25598 62.39451 57.60399
L2_CD103 41.17115  0.00000 35.22782 75.91119 77.57315 71.29572 47.77857 47.81394 46.12346 62.27859 61.52947
L3_CD103 36.82388 35.22782  0.00000 74.57961 78.46781 70.13195 44.55716 48.88906 42.80705 60.21658 57.40966
L1_DP    73.54279 75.91119 74.57961  0.00000 37.89565 35.87247 77.01983 76.60367 73.69541 50.25546 48.62262
L2_DP    78.93084 77.57315 78.46781 37.89565  0.00000 37.84362 82.73552 79.01056 78.95602 49.89255 52.23688
L3_DP    71.86303 71.29572 70.13195 35.87247 37.84362  0.00000 73.92600 72.32881 69.98316 46.18947 46.43774
heatmap.2(as.matrix(sampleDists), trace="none",
          col=viridis,
          ColSideColors=mycols3[condition], RowSideColors=mycols3[condition],
          margin=c(10, 10), main="Sample Distance Matrix",Colv=F,Rowv=F,density.info = 'none')
Discrepancy: Rowv is FALSE, while dendrogram is `both'. Omitting row dendogram.Discrepancy: Colv is FALSE, while dendrogram is `column'. Omitting column dendogram.

#create more color palets
wb <- c("white", "black")
col1 <- colorRampPalette(c("#7F0000", "red", "#FF7F00", "yellow", "white",
                           "cyan", "#007FFF", "blue","#00007F"))
col2 <- colorRampPalette(c("#67001F", "#B2182B", "#D6604D", "#F4A582",
                           "#FDDBC7", "#FFFFFF", "#D1E5F0", "#92C5DE",
                           "#4393C3", "#2166AC", "#053061"))
col3 <- colorRampPalette(c("red", "white", "blue"))
col4 <- colorRampPalette(c("#7F0000", "red", "#FF7F00", "yellow", "#7FFF7F",
                           "cyan", "#007FFF", "blue", "#00007F"))
col5 <- colorRampPalette(c('#ff00ff','magenta','#7fff7f','cyan'))
col6 <- colorRampPalette(c('#008000','green','#FF8C00','darkorange'))
col7 <- colorRampPalette(c('#1b9e77', 'green', '#d95f02','orange','#7570b3','purple'))
#create correlation plots
VSTdata <- vst(dds@assays@data@listData$counts)
cormat <- (cor(VSTdata, method='spearman'))
library(corrplot)
corrplot 0.90 loaded
library(viridis)
#this correlation plot will include comparisons of samples to themselves
corrplot(cormat, type='upper',method='color',col=viridis(direction=-1,100000),is.corr=F, tl.col='black',title='Correlation Matrix',diag=T)

#this plot will remove those "diagnoal" comparisons where the samples are compared to themselves
corrplot(cormat, type='upper',method='color',col=viridis(direction=-1,100000),is.corr=F, tl.col='black',title='Correlation Matrix',diag=F)

# We estimate the variance for each row in the logcounts matrix
logcounts <- counts(dds, normalized=TRUE)
var_genes <- apply(logcounts, 1, var)
head(var_genes)
RP23-271O17.1       Gm26206          Xkr4 RP23-317L18.1 RP23-317L18.4 RP23-317L18.3 
            0             0             0             0             0             0 
#plot heatmaps using specific genes using log counts
library(dplyr)

Attaching package: 㤼㸱dplyr㤼㸲

The following object is masked from 㤼㸱package:gridExtra㤼㸲:

    combine

The following object is masked from 㤼㸱package:Biobase㤼㸲:

    combine

The following object is masked from 㤼㸱package:matrixStats㤼㸲:

    count

The following objects are masked from 㤼㸱package:GenomicRanges㤼㸲:

    intersect, setdiff, union

The following object is masked from 㤼㸱package:GenomeInfoDb㤼㸲:

    intersect

The following objects are masked from 㤼㸱package:IRanges㤼㸲:

    collapse, desc, intersect, setdiff, slice, union

The following objects are masked from 㤼㸱package:S4Vectors㤼㸲:

    first, intersect, rename, setdiff, setequal, union

The following objects are masked from 㤼㸱package:BiocGenerics㤼㸲:

    combine, intersect, setdiff, union

The following objects are masked from 㤼㸱package:stats㤼㸲:

    filter, lag

The following objects are masked from 㤼㸱package:base㤼㸲:

    intersect, setdiff, setequal, union
library(tibble)
heatmapgenes<-c(
  'Tnf',
  'Il2',
  'Gzma',
  'Prf1',
  'Ifng'
)
logcountsheatmap<-as.data.frame(logcounts) %>% rownames_to_column('genes')
logcountsheatmap <- logcountsheatmap %>% filter(logcountsheatmap$genes %in% heatmapgenes)
logcountsheatmap <- logcountsheatmap %>% column_to_rownames('genes')
heatmap.2(as.matrix(logcountsheatmap),col=viridis::plasma,trace="none", main="Select genes 1-stim",scale='row', density.info = 'none', margin=c(8, 6),ColSideColors = c('#1B1B1B','#1B1B1B','#1B1B1B','#585858','#585858','#585858','#969696','#969696','#969696','#D0D0D0','#D0D0D0'),srtCol = 45,colsep=c(3,6,9),Colv=F,Rowv=F,labCol = '')
Discrepancy: Rowv is FALSE, while dendrogram is `both'. Omitting row dendogram.Discrepancy: Colv is FALSE, while dendrogram is `column'. Omitting column dendogram.

#new heatmap using these genes
heatmapgenes<-c(
  'Pdcd1',
  'Cd244',
  'Havcr2',
  'Tigit',
  'Cd200r1',
  'Klrc1'
)
logcountsheatmap<-as.data.frame(logcounts) %>% rownames_to_column('genes')
logcountsheatmap <- logcountsheatmap %>% filter(logcountsheatmap$genes %in% heatmapgenes)
logcountsheatmap <- logcountsheatmap %>% column_to_rownames('genes')
heatmap.2(as.matrix(logcountsheatmap),col=viridis::plasma,trace="none", main="Select genes 2-stim",scale='row', density.info = 'none',margin=c(8, 6),ColSideColors = c('#1B1B1B','#1B1B1B','#1B1B1B','#585858','#585858','#585858','#969696','#969696','#969696','#D0D0D0','#D0D0D0'),srtCol = 45,colsep=c(3,6,9),Colv=F,Rowv=F,labCol = '')
Discrepancy: Rowv is FALSE, while dendrogram is `both'. Omitting row dendogram.Discrepancy: Colv is FALSE, while dendrogram is `column'. Omitting column dendogram.

#new heatmap using these genes
heatmapgenes<-c('Csf2','Itgb2','Prf1','Pik3cd','Itgal','Tnf','Ppp3ca','Klrk1','Tnfsf10','Rac2','Ptk2b','Fyn','Klrc1','Mapk3','Prkcg','Klrc2','Nfatc2','Gzmb','Nfatc1','Fasl','Ifng','Fcgr4','Lcp2','Ucbp1','H2-d1')
logcountsheatmap<-as.data.frame(logcounts) %>% rownames_to_column('genes')
logcountsheatmap <- logcountsheatmap %>% filter(logcountsheatmap$genes %in% heatmapgenes)
logcountsheatmap <- logcountsheatmap %>% column_to_rownames('genes')
heatmap.2(as.matrix(logcountsheatmap),col=viridis::plasma,trace="none", main="Cytotoxicity",scale='row', density.info = 'none',margin=c(8, 6),ColSideColors = c('#1B1B1B','#1B1B1B','#1B1B1B','#585858','#585858','#585858','#969696','#969696','#969696','#D0D0D0','#D0D0D0'),srtCol = 45,colsep=c(3,6,9),cexRow = 1,Colv=F,Rowv=F,labCol = '')
Discrepancy: Rowv is FALSE, while dendrogram is `both'. Omitting row dendogram.Discrepancy: Colv is FALSE, while dendrogram is `column'. Omitting column dendogram.

#new heatmap using these genes
heatmapgenes<-c('Itk','Csf2','Pik3cd','Cd3g','Tnf','Rasgrp1','Ppp3ca','Grap2','Pak6','Fyn','Mapk3','Il10','Jun','Nfatc2','Cd8b1','Nfatc1','Fos','Mapk14','Il2','Il5','Cd40lg','Ifng','Cd8a','Cd28','Lcp2','Pdcd1','Card11')
logcountsheatmap<-as.data.frame(logcounts) %>% rownames_to_column('genes')
logcountsheatmap <- logcountsheatmap %>% filter(logcountsheatmap$genes %in% heatmapgenes)
logcountsheatmap <- logcountsheatmap %>% column_to_rownames('genes')
heatmap.2(as.matrix(logcountsheatmap),col=viridis::plasma,trace="none", main="TCR signalling",scale='row', density.info = 'none',margin=c(6, 6),ColSideColors = c('#1B1B1B','#1B1B1B','#1B1B1B','#585858','#585858','#585858','#969696','#969696','#969696','#D0D0D0','#D0D0D0'),srtCol = 45,colsep=c(3,6,9),cexRow = 1,Colv=F,Rowv=F,labCol = '')
Discrepancy: Rowv is FALSE, while dendrogram is `both'. Omitting row dendogram.Discrepancy: Colv is FALSE, while dendrogram is `column'. Omitting column dendogram.

#new heatmap using these genes
heatmapgenes<-c('Cd86','Jun','Cxcl9','Ticam2','Cd80','Pik3cd','Fos','Mapk14','Tnf','Il1b','Ccl4','Ccl3','Irf5','Tlr2','Mapk3')
logcountsheatmap<-as.data.frame(logcounts) %>% rownames_to_column('genes')
logcountsheatmap <- logcountsheatmap %>% filter(logcountsheatmap$genes %in% heatmapgenes)
logcountsheatmap <- logcountsheatmap %>% column_to_rownames('genes')
heatmap.2(as.matrix(logcountsheatmap),col=viridis::plasma,trace="none", main="TLR Signalling",scale='row', density.info = 'none',margin=c(8, 6),ColSideColors = c('#1B1B1B','#1B1B1B','#1B1B1B','#585858','#585858','#585858','#969696','#969696','#969696','#D0D0D0','#D0D0D0'),srtCol = 45,colsep=c(3,6,9),cexRow = 1,Colv=F,Rowv=F,labCol = '')
Discrepancy: Rowv is FALSE, while dendrogram is `both'. Omitting row dendogram.Discrepancy: Colv is FALSE, while dendrogram is `column'. Omitting column dendogram.

#Shrinkage of effect size
library(ashr)

Attaching package: 㤼㸱ashr㤼㸲

The following object is masked from 㤼㸱package:dendextend㤼㸲:

    prune
res.CD103vsCD49a <- lfcShrink(dds,contrast =c('condition','CD103','CD49a'),type='ashr')
using 'ashr' for LFC shrinkage. If used in published research, please cite:
    Stephens, M. (2016) False discovery rates: a new deal. Biostatistics, 18:2.
    https://doi.org/10.1093/biostatistics/kxw041
res.CD103vsDN <- lfcShrink(dds,contrast =c('condition','CD103','DN'),type='ashr')
using 'ashr' for LFC shrinkage. If used in published research, please cite:
    Stephens, M. (2016) False discovery rates: a new deal. Biostatistics, 18:2.
    https://doi.org/10.1093/biostatistics/kxw041
res.CD103vsDP <- lfcShrink(dds,contrast =c('condition','CD103','DP'),type='ashr')
using 'ashr' for LFC shrinkage. If used in published research, please cite:
    Stephens, M. (2016) False discovery rates: a new deal. Biostatistics, 18:2.
    https://doi.org/10.1093/biostatistics/kxw041
res.CD49avsDP <- lfcShrink(dds,contrast =c('condition','CD49a','DP'),type='ashr')
using 'ashr' for LFC shrinkage. If used in published research, please cite:
    Stephens, M. (2016) False discovery rates: a new deal. Biostatistics, 18:2.
    https://doi.org/10.1093/biostatistics/kxw041
res.CD49avsDN <- lfcShrink(dds,contrast =c('condition','CD49a','DN'),type='ashr')
using 'ashr' for LFC shrinkage. If used in published research, please cite:
    Stephens, M. (2016) False discovery rates: a new deal. Biostatistics, 18:2.
    https://doi.org/10.1093/biostatistics/kxw041
res.DPvsDN <- lfcShrink(dds,contrast =c('condition','DP','DN'),type='ashr')
using 'ashr' for LFC shrinkage. If used in published research, please cite:
    Stephens, M. (2016) False discovery rates: a new deal. Biostatistics, 18:2.
    https://doi.org/10.1093/biostatistics/kxw041
# Get differential expression results
res.CD103vsCD49a <- res.CD103vsCD49a[res.CD103vsCD49a$baseMean>10,]
res.CD103vsDN <- res.CD103vsDN[res.CD103vsDN$baseMean>10,]
res.CD103vsDP <- res.CD103vsDP[res.CD103vsDP$baseMean>10,]
res.CD49avsDP <- res.CD49avsDP[res.CD49avsDP$baseMean>10,]
res.CD49avsDN <- res.CD49avsDN[res.CD49avsDN$baseMean>10,]
res.DPvsDN <- res.DPvsDN[res.DPvsDN$baseMean>10,]

res.CD103vsCD49a <- na.omit(res.CD103vsCD49a)
res.CD103vsDN  <- na.omit(res.CD103vsDN)
res.CD103vsDP <- na.omit(res.CD103vsDP)
res.CD49avsDP <- na.omit(res.CD49avsDP)
res.CD49avsDN  <- na.omit(res.CD49avsDN)
res.DPvsDN <- na.omit(res.DPvsDN)

res.CD103vsCD49a[!complete.cases(res.CD103vsCD49a),]
log2 fold change (MMSE): condition CD103 vs CD49a 
Wald test p-value: condition CD103 vs CD49a 
DataFrame with 0 rows and 5 columns
res.CD103vsDN[!complete.cases(res.CD103vsDN),]
log2 fold change (MMSE): condition CD103 vs DN 
Wald test p-value: condition CD103 vs DN 
DataFrame with 0 rows and 5 columns
res.CD103vsDP[!complete.cases(res.CD103vsDP),]
log2 fold change (MMSE): condition CD103 vs DP 
Wald test p-value: condition CD103 vs DP 
DataFrame with 0 rows and 5 columns
res.CD49avsDP[!complete.cases(res.CD49avsDP),]
log2 fold change (MMSE): condition CD49a vs DP 
Wald test p-value: condition CD49a vs DP 
DataFrame with 0 rows and 5 columns
res.CD49avsDN[!complete.cases(res.CD49avsDN),]
log2 fold change (MMSE): condition CD49a vs DN 
Wald test p-value: condition CD49a vs DN 
DataFrame with 0 rows and 5 columns
res.DPvsDN[!complete.cases(res.DPvsDN),]
log2 fold change (MMSE): condition DP vs DN 
Wald test p-value: condition DP vs DN 
DataFrame with 0 rows and 5 columns
#How many results have a p value of less than 0.05?
table(res.CD103vsCD49a$padj<0.05)

FALSE  TRUE 
 9744  3677 
table(res.CD103vsDN$padj<0.05)

FALSE  TRUE 
11127  1568 
table(res.CD103vsDP$padj<0.05)

FALSE  TRUE 
 7180  6241 
table(res.CD49avsDP$padj<0.05)

FALSE  TRUE 
 9700  2469 
table(res.CD49avsDN$padj<0.05)

FALSE  TRUE 
10446  2975 
table(res.DPvsDN$padj<0.05)

FALSE  TRUE 
 7106  6315 
## Order by adjusted p-value
res.CD103vsCD49a <- res.CD103vsCD49a[order(res.CD103vsCD49a$padj), ]
res.CD103vsDN <- res.CD103vsDN[order(res.CD103vsDN$padj), ]
res.CD103vsDP <- res.CD103vsDP[order(res.CD103vsDP$padj), ]
res.CD49avsDP <- res.CD49avsDP[order(res.CD49avsDP$padj), ]
res.CD49avsDN <- res.CD49avsDN[order(res.CD49avsDN$padj), ]
res.DPvsDN <- res.DPvsDN[order(res.DPvsDN$padj), ]

#look at the first few lines
head(res.CD103vsCD49a)
log2 fold change (MMSE): condition CD103 vs CD49a 
Wald test p-value: condition CD103 vs CD49a 
DataFrame with 6 rows and 5 columns
         baseMean log2FoldChange     lfcSE       pvalue         padj
        <numeric>      <numeric> <numeric>    <numeric>    <numeric>
Fam129a   4052.31       -2.97393  0.119363 3.94934e-139 6.26207e-135
Klrc1     9886.94       -4.52715  0.188247 1.02246e-129 8.10604e-126
Runx2     2566.63       -3.13117  0.131933 1.23473e-126 6.52596e-123
Ifng    104386.20       -3.70315  0.168748 9.84295e-109 3.90174e-105
Ccl3    129614.17       -2.95687  0.136629 5.67974e-106 1.80116e-102
Osbpl3    3012.17       -2.79645  0.129296 8.72665e-106 2.30616e-102
head(res.CD103vsDN)
log2 fold change (MMSE): condition CD103 vs DN 
Wald test p-value: condition CD103 vs DN 
DataFrame with 6 rows and 5 columns
         baseMean log2FoldChange     lfcSE      pvalue        padj
        <numeric>      <numeric> <numeric>   <numeric>   <numeric>
Fam129a   4052.31       -2.15531  0.108441 3.03040e-90 3.84709e-86
Ly6c2     2400.57       -1.93089  0.107899 4.87544e-74 3.09469e-70
Ctla2a    1595.19       -2.12731  0.132624 2.88829e-60 1.22223e-56
Ccr5      1167.97       -2.41305  0.152249 1.24760e-58 3.95955e-55
Klrc1     9886.94       -2.63747  0.170561 1.02588e-55 2.60472e-52
Itgae     1211.46        5.84010  0.394686 5.08921e-52 1.07679e-48
head(res.CD103vsDP)
log2 fold change (MMSE): condition CD103 vs DP 
Wald test p-value: condition CD103 vs DP 
DataFrame with 6 rows and 5 columns
        baseMean log2FoldChange     lfcSE       pvalue         padj
       <numeric>      <numeric> <numeric>    <numeric>    <numeric>
Ccl3   129614.17       -4.22499  0.121879 7.73093e-265 1.38886e-260
Runx2    2566.63       -4.06137  0.119099 1.96275e-256 1.76304e-252
Osbpl3   3012.17       -3.89704  0.116200 3.36595e-248 2.01565e-244
Csf2     2769.30       -5.56545  0.170538 2.01488e-235 9.04931e-232
Ifng   104386.20       -4.76052  0.150690 1.34984e-220 4.84998e-217
Klrc1    9886.94       -4.90089  0.169058 2.30919e-186 6.91411e-183
head(res.CD49avsDP)
log2 fold change (MMSE): condition CD49a vs DP 
Wald test p-value: condition CD49a vs DP 
DataFrame with 6 rows and 5 columns
          baseMean log2FoldChange     lfcSE      pvalue        padj
         <numeric>      <numeric> <numeric>   <numeric>   <numeric>
Lad1      4467.378        2.17085  0.133314 8.87543e-63 1.08005e-58
Ms4a4c    3896.673        2.35223  0.143979 1.84654e-62 1.12353e-58
Rgs16    27786.393       -1.62303  0.107300 3.64479e-55 1.47845e-51
Tnfrsf25   223.114        3.43372  0.232245 3.65263e-51 1.11122e-47
Itgae     1211.457       -4.90551  0.388737 6.40062e-39 1.55778e-35
Cxcr5     1279.197        2.43923  0.197123 1.78455e-37 3.61936e-34
head(res.CD49avsDN)
log2 fold change (MMSE): condition CD49a vs DN 
Wald test p-value: condition CD49a vs DN 
DataFrame with 6 rows and 5 columns
        baseMean log2FoldChange     lfcSE      pvalue        padj
       <numeric>      <numeric> <numeric>   <numeric>   <numeric>
Fgl2     1559.56        3.66303 0.1788661 2.00668e-94 2.97029e-90
Lgals3   5196.72        3.95031 0.2032943 3.09046e-85 2.28725e-81
Ttc39c   1577.44        2.92511 0.1580029 2.18189e-78 1.07654e-74
Adam8    3920.97        3.76787 0.2066702 1.90253e-75 7.04030e-72
Dusp4    1649.14        1.68541 0.0988929 1.48937e-66 4.40912e-63
Capg     3242.88        2.69761 0.1610524 3.86043e-65 9.52368e-62
head(res.DPvsDN)
log2 fold change (MMSE): condition DP vs DN 
Wald test p-value: condition DP vs DN 
DataFrame with 6 rows and 5 columns
        baseMean log2FoldChange     lfcSE       pvalue         padj
       <numeric>      <numeric> <numeric>    <numeric>    <numeric>
Rgs16   27786.39        3.41290 0.0951948 8.85111e-284 1.63675e-279
Fgl2     1559.56        5.07640 0.1622219 2.48978e-216 2.30205e-212
Capg     3242.88        4.42787 0.1433817 5.03620e-211 3.10432e-207
Lgals3   5196.72        5.52236 0.1828138 9.01773e-202 4.16890e-198
Csf2     2769.30        4.88956 0.1639249 6.40214e-197 2.36777e-193
Adam8    3920.97        5.53318 0.1858425 4.11312e-196 1.26766e-192
#MA plots
#An MA-plot (Dudoit et al. 2002) provides a useful overview for the distribution of the estimated coefficients in the model, e.g. the comparisons of interest, across all genes. On the y-axis, the “M” stands for “minus” – subtraction of log values is equivalent to the log of the ratio – and on the x-axis, the “A” stands for “average”. You may hear this plot also referred to as a mean-difference plot, or a Bland-Altman plot.
plotMA(res.CD103vsDP, ylim=c(-2,2),colNonSig="#440154FF",colSig="#21908CFF",colLine="#FDE725FF")

plotMA(res.CD103vsDN, ylim=c(-2,2),colNonSig="#440154FF",colSig="#21908CFF",colLine="#FDE725FF")

plotMA(res.CD103vsCD49a, ylim=c(-2,2),colNonSig="#440154FF",colSig="#21908CFF",colLine="#FDE725FF")

plotMA(res.CD49avsDP, ylim=c(-2,2),colNonSig="#440154FF",colSig="#21908CFF",colLine="#FDE725FF")

plotMA(res.CD49avsDN, ylim=c(-2,2),colNonSig="#440154FF",colSig="#21908CFF",colLine="#FDE725FF")

plotMA(res.DPvsDN, ylim=c(-2,2),colNonSig="#440154FF",colSig="#21908CFF",colLine="#FDE725FF")

#IHW
#run IHW package (independent hypothesis testing) from this paper: 
#http://bioconductor.org/packages/release/bioc/vignettes/IHW/inst/doc/introduction_to_ihw.html#an-example-rna-seq-differential-expression
#https://www.nature.com/articles/nmeth.3885
#Independent hypothesis weighting is a more powerful way to investigate differential expression. The citations above explain in full.
library("IHW")

Attaching package: 㤼㸱IHW㤼㸲

The following object is masked from 㤼㸱package:ggplot2㤼㸲:

    alpha
res.CD103vsCD49aDF <- as.data.frame(res.CD103vsCD49a)
res.CD103vsDPDF <- as.data.frame(res.CD103vsDP)
res.CD103vsDNDF <- as.data.frame(res.CD103vsDN)
res.CD49avsDPDF <- as.data.frame(res.CD49avsDP)
res.CD49avsDNDF <- as.data.frame(res.CD49avsDN)
res.DPvsDNDF <- as.data.frame(res.DPvsDN)

#In particular, we have p-values and baseMean (i.e., the mean of normalized counts) for each gene. As argued in the DESeq2 paper, these two statistics are approximately independent under the null hypothesis. Thus we have all the ingredients necessary for a IHW analysis (p-values and covariates), which we will apply at a significance level 0.05.
ihw.res.CD103vsCD49a <- ihw(pvalue ~ baseMean,  data = res.CD103vsCD49aDF, alpha = 0.05)
ihw.res.CD103vsDP <- ihw(pvalue ~ baseMean,  data = res.CD103vsDPDF, alpha = 0.05)
ihw.res.CD103vsDN <- ihw(pvalue ~ baseMean,  data = res.CD103vsDNDF, alpha = 0.05)
ihw.res.CD49avsDP <- ihw(pvalue ~ baseMean,  data = res.CD49avsDPDF, alpha = 0.05)
ihw.res.CD49avsDN <- ihw(pvalue ~ baseMean,  data = res.CD49avsDNDF, alpha = 0.05)
ihw.res.DPvsDN <- ihw(pvalue ~ baseMean,  data = res.DPvsDNDF, alpha = 0.05)
#This returns an object of the class ihwResult.
#add the gene names to the ihw df so we can get the gene names to give to enrichr
#Note the weighted p value cutoff is 0.05 and that the log2foldchange must be 
#greater than 1 or less than -1 to be considered differentially expressed
#CD103vsCD49a
de.ihw.res.CD103vsCD49a <- ihw.res.CD103vsCD49a@df
dim(res.CD103vsCD49a)
[1] 13421     5
dim(de.ihw.res.CD103vsCD49a)
[1] 13421     7
genes.res.CD103vsCD49a <- rownames(res.CD103vsCD49a)
genes.res.CD103vsCD49a <- as.vector(genes.res.CD103vsCD49a)
de.ihw.res.CD103vsCD49a["gene"] <- genes.res.CD103vsCD49a
ihw.res.CD103vsCD49a.all <- de.ihw.res.CD103vsCD49a
de.ihw.res.CD103vsCD49a <- de.ihw.res.CD103vsCD49a[de.ihw.res.CD103vsCD49a[,"weighted_pvalue"]<0.05,]
dim(de.ihw.res.CD103vsCD49a)
[1] 4895    8
ihw.genes.res.CD103vsCD49a <- de.ihw.res.CD103vsCD49a$gene
head(ihw.genes.res.CD103vsCD49a)
[1] "Fam129a" "Klrc1"   "Runx2"   "Ifng"    "Ccl3"    "Osbpl3" 
ihw.res.CD103vsCD49a.all <- data.frame(ihw.res.CD103vsCD49a.all, row.names = 8)
ihw.res.CD103vsCD49a.all['log2FoldChange'] <- as.vector(res.CD103vsCD49a$log2FoldChange)
#make set of genes that are up and down regulated
ihw.genes.res.CD103vsCD49a.up <- ihw.res.CD103vsCD49a.all[ihw.res.CD103vsCD49a.all[,"log2FoldChange"]>1,]
ihw.genes.res.CD103vsCD49a.up <- ihw.genes.res.CD103vsCD49a.up[ihw.genes.res.CD103vsCD49a.up[,"weighted_pvalue"]<0.05,]
ihw.genes.res.CD103vsCD49a.down <- ihw.res.CD103vsCD49a.all[ihw.res.CD103vsCD49a.all[,"log2FoldChange"]<(-1),]
ihw.genes.res.CD103vsCD49a.down <- ihw.genes.res.CD103vsCD49a.down[ihw.genes.res.CD103vsCD49a.down[,"weighted_pvalue"]<0.05,]
upgenes.ihw.res.CD103vsCD49a <- rownames(ihw.genes.res.CD103vsCD49a.up)
downgenes.ihw.res.CD103vsCD49a <- rownames(ihw.genes.res.CD103vsCD49a.down)

#CD103vsDP
de.ihw.res.CD103vsDP <- ihw.res.CD103vsDP@df
dim(res.CD103vsDP)
[1] 13421     5
dim(de.ihw.res.CD103vsDP)
[1] 13421     7
genes.res.CD103vsDP <- rownames(res.CD103vsDP)
genes.res.CD103vsDP <- as.vector(genes.res.CD103vsDP)
de.ihw.res.CD103vsDP["gene"] <- genes.res.CD103vsDP
ihw.res.CD103vsDP.all <- de.ihw.res.CD103vsDP
de.ihw.res.CD103vsDP <- de.ihw.res.CD103vsDP[de.ihw.res.CD103vsDP[,"weighted_pvalue"]<0.05,]
dim(de.ihw.res.CD103vsDP)
[1] 7146    8
ihw.genes.res.CD103vsDP <- de.ihw.res.CD103vsDP$gene
head(ihw.genes.res.CD103vsDP)
[1] "Ccl3"   "Runx2"  "Osbpl3" "Csf2"   "Ifng"   "Klrc1" 
ihw.res.CD103vsDP.all <- data.frame(ihw.res.CD103vsDP.all, row.names = 8)
ihw.res.CD103vsDP.all['log2FoldChange'] <- as.vector(res.CD103vsDP$log2FoldChange)
#make set of genes that are up and down regulated
ihw.genes.res.CD103vsDP.up <- ihw.res.CD103vsDP.all[ihw.res.CD103vsDP.all[,"log2FoldChange"]>1,]
ihw.genes.res.CD103vsDP.up <- ihw.genes.res.CD103vsDP.up[ihw.genes.res.CD103vsDP.up[,"weighted_pvalue"]<0.05,]
ihw.genes.res.CD103vsDP.down <- ihw.res.CD103vsDP.all[ihw.res.CD103vsDP.all[,"log2FoldChange"]<(-1),]
ihw.genes.res.CD103vsDP.down <- ihw.genes.res.CD103vsDP.down[ihw.genes.res.CD103vsDP.down[,"weighted_pvalue"]<0.05,]
upgenes.ihw.res.CD103vsDP <- rownames(ihw.genes.res.CD103vsDP.up)
downgenes.ihw.res.CD103vsDP <- rownames(ihw.genes.res.CD103vsDP.down)

#CD103vsDN
de.ihw.res.CD103vsDN <- ihw.res.CD103vsDN@df
dim(res.CD103vsDN)
[1] 12695     5
dim(de.ihw.res.CD103vsDN)
[1] 12695     7
genes.res.CD103vsDN <- rownames(res.CD103vsDN)
genes.res.CD103vsDN <- as.vector(genes.res.CD103vsDN)
de.ihw.res.CD103vsDN["gene"] <- genes.res.CD103vsDN
ihw.res.CD103vsDN.all <- de.ihw.res.CD103vsDN
de.ihw.res.CD103vsDN <- de.ihw.res.CD103vsDN[de.ihw.res.CD103vsDN[,"weighted_pvalue"]<0.05,]
dim(de.ihw.res.CD103vsDN)
[1] 3023    8
ihw.genes.res.CD103vsDN <- de.ihw.res.CD103vsDN$gene
head(ihw.genes.res.CD103vsDN)
[1] "Fam129a" "Ly6c2"   "Ctla2a"  "Ccr5"    "Klrc1"   "Itgae"  
ihw.res.CD103vsDN.all <- data.frame(ihw.res.CD103vsDN.all, row.names = 8)
ihw.res.CD103vsDN.all['log2FoldChange'] <- as.vector(res.CD103vsDN$log2FoldChange)
#make set of genes that are up and down regulated
ihw.genes.res.CD103vsDN.up <- ihw.res.CD103vsDN.all[ihw.res.CD103vsDN.all[,"log2FoldChange"]>1,]
ihw.genes.res.CD103vsDN.up <- ihw.genes.res.CD103vsDN.up[ihw.genes.res.CD103vsDN.up[,"weighted_pvalue"]<0.05,]
ihw.genes.res.CD103vsDN.down <- ihw.res.CD103vsDN.all[ihw.res.CD103vsDN.all[,"log2FoldChange"]<(-1),]
ihw.genes.res.CD103vsDN.down <- ihw.genes.res.CD103vsDN.down[ihw.genes.res.CD103vsDN.down[,"weighted_pvalue"]<0.05,]
upgenes.ihw.res.CD103vsDN <- rownames(ihw.genes.res.CD103vsDN.up)
downgenes.ihw.res.CD103vsDN <- rownames(ihw.genes.res.CD103vsDN.down)

#CD49avsDP
de.ihw.res.CD49avsDP <- ihw.res.CD49avsDP@df
dim(res.CD49avsDP)
[1] 12169     5
dim(de.ihw.res.CD49avsDP)
[1] 12169     7
genes.res.CD49avsDP <- rownames(res.CD49avsDP)
genes.res.CD49avsDP <- as.vector(genes.res.CD49avsDP)
de.ihw.res.CD49avsDP["gene"] <- genes.res.CD49avsDP
ihw.res.CD49avsDP.all <- de.ihw.res.CD49avsDP
de.ihw.res.CD49avsDP <- de.ihw.res.CD49avsDP[de.ihw.res.CD49avsDP[,"weighted_pvalue"]<0.05,]
dim(de.ihw.res.CD49avsDP)
[1] 3812    8
ihw.genes.res.CD49avsDP <- de.ihw.res.CD49avsDP$gene
head(ihw.genes.res.CD49avsDP)
[1] "Lad1"     "Ms4a4c"   "Rgs16"    "Tnfrsf25" "Itgae"    "Cxcr5"   
ihw.res.CD49avsDP.all <- data.frame(ihw.res.CD49avsDP.all, row.names = 8)
ihw.res.CD49avsDP.all['log2FoldChange'] <- as.vector(res.CD49avsDP$log2FoldChange)
#make set of genes that are up and down regulated
ihw.genes.res.CD49avsDP.up <- ihw.res.CD49avsDP.all[ihw.res.CD49avsDP.all[,"log2FoldChange"]>1,]
ihw.genes.res.CD49avsDP.up <- ihw.genes.res.CD49avsDP.up[ihw.genes.res.CD49avsDP.up[,"weighted_pvalue"]<0.05,]
ihw.genes.res.CD49avsDP.down <- ihw.res.CD49avsDP.all[ihw.res.CD49avsDP.all[,"log2FoldChange"]<(-1),]
ihw.genes.res.CD49avsDP.down <- ihw.genes.res.CD49avsDP.down[ihw.genes.res.CD49avsDP.down[,"weighted_pvalue"]<0.05,]
upgenes.ihw.res.CD49avsDP <- rownames(ihw.genes.res.CD49avsDP.up)
downgenes.ihw.res.CD49avsDP <- rownames(ihw.genes.res.CD49avsDP.down)

#CD49avsDN
de.ihw.res.CD49avsDN <- ihw.res.CD49avsDN@df
dim(res.CD49avsDN)
[1] 13421     5
dim(de.ihw.res.CD49avsDN)
[1] 13421     7
genes.res.CD49avsDN <- rownames(res.CD49avsDN)
genes.res.CD49avsDN <- as.vector(genes.res.CD49avsDN)
de.ihw.res.CD49avsDN["gene"] <- genes.res.CD49avsDN
ihw.res.CD49avsDN.all <- de.ihw.res.CD49avsDN
de.ihw.res.CD49avsDN <- de.ihw.res.CD49avsDN[de.ihw.res.CD49avsDN[,"weighted_pvalue"]<0.05,]
dim(de.ihw.res.CD49avsDN)
[1] 4401    8
ihw.genes.res.CD49avsDN <- de.ihw.res.CD49avsDN$gene
head(ihw.genes.res.CD49avsDN)
[1] "Fgl2"   "Lgals3" "Ttc39c" "Adam8"  "Dusp4"  "Capg"  
ihw.res.CD49avsDN.all <- data.frame(ihw.res.CD49avsDN.all, row.names = 8)
ihw.res.CD49avsDN.all['log2FoldChange'] <- as.vector(res.CD49avsDN$log2FoldChange)
#make set of genes that are up and down regulated
ihw.genes.res.CD49avsDN.up <- ihw.res.CD49avsDN.all[ihw.res.CD49avsDN.all[,"log2FoldChange"]>1,]
ihw.genes.res.CD49avsDN.up <- ihw.genes.res.CD49avsDN.up[ihw.genes.res.CD49avsDN.up[,"weighted_pvalue"]<0.05,]
ihw.genes.res.CD49avsDN.down <- ihw.res.CD49avsDN.all[ihw.res.CD49avsDN.all[,"log2FoldChange"]<(-1),]
ihw.genes.res.CD49avsDN.down <- ihw.genes.res.CD49avsDN.down[ihw.genes.res.CD49avsDN.down[,"weighted_pvalue"]<0.05,]
upgenes.ihw.res.CD49avsDN <- rownames(ihw.genes.res.CD49avsDN.up)
downgenes.ihw.res.CD49avsDN <- rownames(ihw.genes.res.CD49avsDN.down)

#DPvsDN
de.ihw.res.DPvsDN <- ihw.res.DPvsDN@df
dim(res.DPvsDN)
[1] 13421     5
dim(de.ihw.res.DPvsDN)
[1] 13421     7
genes.res.DPvsDN <- rownames(res.DPvsDN)
genes.res.DPvsDN <- as.vector(genes.res.DPvsDN)
de.ihw.res.DPvsDN["gene"] <- genes.res.DPvsDN
ihw.res.DPvsDN.all <- de.ihw.res.DPvsDN
de.ihw.res.DPvsDN <- de.ihw.res.DPvsDN[de.ihw.res.DPvsDN[,"weighted_pvalue"]<0.05,]
dim(de.ihw.res.DPvsDN)
[1] 7195    8
ihw.genes.res.DPvsDN <- de.ihw.res.DPvsDN$gene
head(ihw.genes.res.DPvsDN)
[1] "Rgs16"  "Fgl2"   "Capg"   "Lgals3" "Csf2"   "Adam8" 
ihw.res.DPvsDN.all <- data.frame(ihw.res.DPvsDN.all, row.names = 8)
ihw.res.DPvsDN.all['log2FoldChange'] <- as.vector(res.DPvsDN$log2FoldChange)
#make set of genes that are up and down regulated
#ihw.genes.res.DPvsDN.up <- ihw.res.DPvsDN.all[ihw.res.DPvsDN.all[,"weighted_pvalue"]<.05,]
ihw.genes.res.DPvsDN.up <- ihw.res.DPvsDN.all[ihw.res.DPvsDN.all[,"log2FoldChange"]>1,]
ihw.genes.res.DPvsDN.up <- ihw.genes.res.DPvsDN.up[ihw.genes.res.DPvsDN.up[,"weighted_pvalue"]<0.05,]
ihw.genes.res.DPvsDN.down <- ihw.res.DPvsDN.all[ihw.res.DPvsDN.all[,"log2FoldChange"]<(-1),]
ihw.genes.res.DPvsDN.down <- ihw.genes.res.DPvsDN.down[ihw.genes.res.DPvsDN.down[,"weighted_pvalue"]<0.05,]
upgenes.ihw.res.DPvsDN <- rownames(ihw.genes.res.DPvsDN.up)
downgenes.ihw.res.DPvsDN <- rownames(ihw.genes.res.DPvsDN.down)
#sort by lfc
orderedlfc <- ihw.res.DPvsDN.all[order(ihw.res.DPvsDN.all$log2FoldChange), ]
head(orderedlfc)
#keep only values of weighed p values of <.05
orderedlfc<-orderedlfc[orderedlfc[,'weighted_pvalue']<.05,] 
downorderedlfc<-orderedlfc[1:500,]
orderedlfc <- orderedlfc[rev(seq_len(nrow(orderedlfc))), , drop = FALSE]
uporderedlfc<-orderedlfc[1:500,]
combinedlfc<-rbind(uporderedlfc,downorderedlfc)
rownameslfc<-row.names(combinedlfc)
highly_variable_lcpm <- logcounts[rownameslfc,]
dim(highly_variable_lcpm)
[1] 1000   11
head(highly_variable_lcpm)
            L1_CD103    L2_CD103    L3_CD103        L1_DP       L2_DP        L3_DP       L1_DN     L2_DN
Card10     3.4677937   12.692651   19.468783    252.33973   356.13951    201.69322   0.0000000   0.00000
Ccl1    1630.7300052 1252.341591 2235.665254 128442.74684 99718.06570 131509.21500 533.2982614 742.89939
Itgae   1058.5440384 1347.536476  966.949558   3249.44344  3527.47707   2945.07019  20.0750573  28.46358
Tmem171    0.8669484    0.000000    3.244797    133.91314   180.56373    124.85770   0.8728286   0.00000
Ifitm1    77.1584107   99.425768   90.854321   3161.98996  3125.44843   3843.52179  53.2425433  15.18058
Plekhf1    2.6008453    2.115442    6.489594     52.83648    83.79753     29.68645   0.0000000   0.00000
             L3_DN    L2_CD49a     L3_CD49a
Card10    0.000000    49.67075    46.508469
Ccl1    816.093931 16224.03454 25061.998546
Itgae     4.994455    72.32758   105.149582
Tmem171   0.000000    32.24241    14.154751
Ifitm1   23.973384  1219.98326  1601.509024
Plekhf1   0.000000    33.11383     8.088429
as.data.frame(highly_variable_lcpm)
type(highly_variable_lcpm)
[1] "double"
#reorder this
highly_variable_lcpm <- highly_variable_lcpm[,c("L1_DP","L2_DP","L3_DP", "L2_CD49a","L3_CD49a","L1_CD103","L2_CD103","L3_CD103", "L1_DN", "L2_DN","L3_DN")]
# Plot the heatmap
mycols3 <-colorspace::sequential_hcl(5, "grays")
heatmap.2(highly_variable_lcpm,col=viridis::plasma,trace="none",scale='row',Colv = F,labRow =F, labCol="", dendrogram = c('none'), Rowv=F,density.info = 'none',colsep=c(3,5,8), margin=c(10, 3), srtCol = 45, ColSideColors = c('#8744f6','#8744f6','#8744f6','#414141','#414141','#acfafa','#acfafa','#acfafa','#f29737','#f29737','#f29737'))

#write csvs of these results
#downregulated
write.csv(ihw.genes.res.CD103vsCD49a.down,'ihw.genes.res.CD103vsCD49a.down.csv')
write.csv(ihw.genes.res.CD103vsDN.down,'ihw.genes.res.CD103vsDN.down.csv')
write.csv(ihw.genes.res.CD103vsDP.down,'ihw.genes.res.CD103vsDP.down.csv')
write.csv(ihw.genes.res.CD49avsDP.down,'ihw.genes.res.CD49avsDP.down.csv')
write.csv(ihw.genes.res.CD49avsDN.down,'ihw.genes.res.CD49avsDN.down.csv')
write.csv(ihw.genes.res.DPvsDN.down,'ihw.genes.res.DPvsDN.down.csv')

#upregulated
write.csv(ihw.genes.res.CD103vsCD49a.up,'ihw.genes.res.CD103vsCD49a.up.csv')
write.csv(ihw.genes.res.CD103vsDN.up,'ihw.genes.res.CD103vsDN.up.csv')
write.csv(ihw.genes.res.CD103vsDP.up,'ihw.genes.res.CD103vsDP.up.csv')
write.csv(ihw.genes.res.CD49avsDP.up,'ihw.genes.res.CD49avsDP.up.csv')
write.csv(ihw.genes.res.CD49avsDN.up,'ihw.genes.res.CD49avsDN.up.csv')
write.csv(ihw.genes.res.DPvsDN.up,'ihw.genes.res.DPvsDN.up.csv')

#all genes
write.csv(ihw.res.CD103vsCD49a.all,'ihw.res.CD103vsCD49a.all.csv')
write.csv(ihw.res.CD103vsDN.all,'ihw.res.CD103vsDN.all.csv')
write.csv(ihw.res.CD103vsDP.all,'ihw.res.CD103vsDP.all.csv')
write.csv(ihw.res.CD49avsDP.all,'ihw.res.CD49avsDP.all.csv')
write.csv(ihw.res.CD49avsDN.all,'ihw.res.CD49avsDN.all.csv')
write.csv(ihw.res.DPvsDN.all,'ihw.res.DPvsDN.all.csv')

write.csv(ihw.res.DPvsDN.all,'ihw.res.DPvsDN.all.stim.4-14-21.csv')
#plot labeled volcano plots for all six comparisons
library(EnhancedVolcano)
Loading required package: ggrepel
Registered S3 methods overwritten by 'ggalt':
  method                  from   
  grid.draw.absoluteGrob  ggplot2
  grobHeight.absoluteGrob ggplot2
  grobWidth.absoluteGrob  ggplot2
  grobX.absoluteGrob      ggplot2
  grobY.absoluteGrob      ggplot2
viridispal4other<-c('#FDE725FF','#31688EFF','#35B779FF',"#440154FF")
EnhancedVolcano(ihw.res.CD103vsCD49a.all,
                lab = rownames(ihw.res.CD103vsCD49a.all),  #labels points with gene names
                x = 'log2FoldChange',  #X and Y are based on column names from Res file
                y = 'weighted_pvalue',
                xlim = c(-8, 8),  #Play around with limits to make sure all your data fits, it doesn't indicate if a point is off scale
                xlab = bquote(~Log[2]~ 'Fold Change'),  #X and Y manual labels
                ylab = bquote(~-Log[10]~weighted~italic(P)),
                title = 'CD103 vs CD49a',
                FCcutoff = 1.0,
                pointSize = 3.0,
                labSize = 3.0,
                subtitle='',
                col=viridispal4other,
                colAlpha = 0.3,) #Sets transparency of points on volcano plot, 1=100%opaque, 0=100% transparent





EnhancedVolcano(ihw.res.CD103vsDP.all,
                lab = rownames(ihw.res.CD103vsDP.all),  #labels points with gene names
                x = 'log2FoldChange',  #X and Y are based on column names from Res file
                y = 'weighted_pvalue',
                xlim = c(-8, 8),  #Play around with limits to make sure all your data fits, it doesn't indicate if a point is off scale
                xlab = bquote(~Log[2]~ 'Fold Change'),  #X and Y manual labels
                ylab = bquote(~-Log[10]~weighted~italic(P)),
                title = 'CD103 vs DP',
                FCcutoff = 1.0,
                pointSize = 3.0,
                labSize = 3.0,
                subtitle='',
                col=viridispal4other,
                colAlpha = 0.2) #Sets transparency of points on volcano plot, 1=100%opaque, 0=100% transparent




EnhancedVolcano(ihw.res.CD103vsDN.all,
                lab = rownames(ihw.res.CD103vsDN.all),  #labels points with gene names
                x = 'log2FoldChange',  #X and Y are based on column names from Res file
                y = 'weighted_pvalue',
                xlim = c(-8, 8),  #Play around with limits to make sure all your data fits, it doesn't indicate if a point is off scale
                xlab = bquote(~Log[2]~ 'Fold Change'),  #X and Y manual labels
                ylab = bquote(~-Log[10]~weighted~italic(P)),
                title = 'CD103 vs DN',
                FCcutoff = 1.0,
                pointSize = 3.0,
                labSize = 3.0,
                subtitle='',
                col=viridispal4other,
                colAlpha = 0.2) #Sets transparency of points on volcano plot, 1=100%opaque, 0=100% transparent




EnhancedVolcano(ihw.res.CD49avsDP.all,
                lab = rownames(ihw.res.CD49avsDP.all),  #labels points with gene names
                x = 'log2FoldChange',  #X and Y are based on column names from Res file
                y = 'weighted_pvalue',
                xlim = c(-8, 8),  #Play around with limits to make sure all your data fits, it doesn't indicate if a point is off scale
                xlab = bquote(~Log[2]~ 'Fold Change'),  #X and Y manual labels
                ylab = bquote(~-Log[10]~weighted~italic(P)),
                title = 'CD49a vs DP',
                FCcutoff = 1.0,
                pointSize = 3.0,
                labSize = 3.0,
                subtitle='',
                col=viridispal4other,
                colAlpha = 0.2) #Sets transparency of points on volcano plot, 1=100%opaque, 0=100% transparent





EnhancedVolcano(ihw.res.CD49avsDN.all,
                lab = rownames(ihw.res.CD49avsDN.all),  #labels points with gene names
                x = 'log2FoldChange',  #X and Y are based on column names from Res file
                y = 'weighted_pvalue',
                xlim = c(-8, 8),  #Play around with limits to make sure all your data fits, it doesn't indicate if a point is off scale
                xlab = bquote(~Log[2]~ 'Fold Change'),  #X and Y manual labels
                ylab = bquote(~-Log[10]~weighted~italic(P)),
                title = 'CD49a vs DN',
                FCcutoff = 1.0,
                pointSize = 3.0,
                labSize = 3.0,
                subtitle='',
                col=viridispal4other,
                colAlpha = 0.2) #Sets transparency of points on volcano plot, 1=100%opaque, 0=100% transparent




EnhancedVolcano(ihw.res.DPvsDN.all,
                lab = rownames(ihw.res.DPvsDN.all),  #labels points with gene names
                x = 'log2FoldChange',  #X and Y are based on column names from Res file
                y = 'weighted_pvalue',
                xlim = c(-8, 8),  #Play around with limits to make sure all your data fits, it doesn't indicate if a point is off scale
                xlab = bquote(~Log[2]~ 'Fold Change'),  #X and Y manual labels
                ylab = bquote(~-Log[10]~weighted~italic(P)),
                title = 'DP vs DN',
                FCcutoff = 1.0,
                pointSize = 3.0,
                labSize = 3.0,
                subtitle='',
                col=viridispal4other,
                colAlpha = 0.2) #Sets transparency of points on volcano plot, 1=100%opaque, 0=100% transparent

#plot a variety of other volcano plots
library(EnhancedVolcano)
viridispal4other<-c('#FDE725FF','#31688EFF','#35B779FF',"#440154FF")
setone<-ihw.res.DPvsDN.all[c('Ifng','Tnf','Il2','Ccl1','Csf2','Prf','Gzma','Fasl'),]
EnhancedVolcano(setone,
                lab = rownames(setone),  #labels points with gene names
                x = 'log2FoldChange',  #X and Y are based on column names from Res file
                y = 'weighted_pvalue',
                xlim = c(-8, 8),  #Play around with limits to make sure all your data fits, it doesn't indicate if a point is off scale
                ylim = c(0, 300),
                 xlab = bquote(~Log[2]~ 'Fold Change'),  #X and Y manual labels
                ylab = bquote(~-Log[10]~weighted~italic(P)),
                title = 'DP vs DN',
                FCcutoff = 1.0,
                pointSize = 3.0,
                labSize = 3.0,
                subtitle='',
                col=viridispal4other,
                colAlpha = 0.8, #Sets transparency of points on volcano plot, 1=100%opaque, 0=100% transparent
                selectLab = c('Ifng','Tnf','Il2','Ccl1','Csf2','Prf','Gzma','Fasl')) 


EnhancedVolcano(ihw.res.DPvsDN.all,
                lab = rownames(ihw.res.DPvsDN.all),  #labels points with gene names
                x = 'log2FoldChange',  #X and Y are based on column names from Res file
                y = 'weighted_pvalue',
                xlim = c(-8, 8),  #Play around with limits to make sure all your data fits, it doesn't indicate if a point is off scale
                ylim = c(0, 300),
                xlab = bquote(~Log[2]~ 'Fold Change'),  #X and Y manual labels
                ylab = bquote(~-Log[10]~weighted~italic(P)),
                title = 'DP vs DN',
                FCcutoff = 1.0,
                pointSize = 3.0,
                labSize = 3.0,
                subtitle='',
                col=c('#d3d3d3','#d3d3d3','#d3d3d3','#d3d3d3'),
                selectLab = c(''),
                colAlpha = 0.1,) #Sets transparency of points on volcano plot, 1=100%opaque, 0=100% transparent) 




EnhancedVolcano(ihw.res.DPvsDN.all,
                lab = rownames(ihw.res.CD103vsCD49a.all),  #labels points with gene names
                x = 'log2FoldChange',  #X and Y are based on column names from Res file
                y = 'weighted_pvalue',
                xlim = c(-8, 8),  #Play around with limits to make sure all your data fits, it doesn't indicate if a point is off scale
                xlab = bquote(~Log[2]~ 'Fold Change'),  #X and Y manual labels
                ylab = bquote(~-Log[10]~weighted~italic(P)),
                title = 'DP vs DN',
                FCcutoff = 1.0,
                pointSize = 3.0,
                labSize = 3.0,
                subtitle='',
                col=viridispal4other,
                colAlpha = 0.3, #Sets transparency of points on volcano plot, 1=100%opaque, 0=100% transparent
                selectLab = c('Ifng','Tnf','Il2','Ccl1','Csf2','Prf','Gzma','Fasl',"Csf1", 'Il10','Ccl3','Il21','Il17a','Cxcl9','Gzmb','Gzmc','Tnfsf10'))

#Enrichr
#https://www.biostars.org/p/343196/
library(enrichR)
Welcome to enrichR
Checking connection ... 
Enrichr ... Connection is Live!
FlyEnrichr ... Connection is available!
WormEnrichr ... Connection is available!
YeastEnrichr ... Connection is available!
FishEnrichr ... Connection is available!
listEnrichrDbs()
library(ggplot2)
theme_set(theme_bw())  
dbs <- listEnrichrDbs()
alldbs <- listEnrichrDbs()
dbs <- c( "GO_Biological_Process_2018" ,
          "KEGG_2019_Mouse", 
          "TRRUST_Transcription_Factors_2019",
          'TRANSFAC_and_JASPAR_PWMs',
          'Transcription_Factor_PPIs','Reactome_2016')
db <- dbs
viridispal2 <- viridis(n=2)


#CD103vsCD49a

list_up <- c(upgenes.ihw.res.CD103vsCD49a)
list_down <- c(downgenes.ihw.res.CD103vsCD49a)
eup <- enrichr(list_up, dbs)
Uploading data to Enrichr... Done.
  Querying GO_Biological_Process_2018... Done.
  Querying KEGG_2019_Mouse... Done.
  Querying TRRUST_Transcription_Factors_2019... Done.
  Querying TRANSFAC_and_JASPAR_PWMs... Done.
  Querying Transcription_Factor_PPIs... Done.
  Querying Reactome_2016... Done.
Parsing results... Done.
edown <- enrichr(list_down, dbs)
Uploading data to Enrichr... Done.
  Querying GO_Biological_Process_2018... Done.
  Querying KEGG_2019_Mouse... Done.
  Querying TRRUST_Transcription_Factors_2019... Done.
  Querying TRANSFAC_and_JASPAR_PWMs... Done.
  Querying Transcription_Factor_PPIs... Done.
  Querying Reactome_2016... Done.
Parsing results... Done.
up <- eup$KEGG_2019_Mouse
down <- edown$KEGG_2019_Mouse
        #kegg
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from Kegg pathways", 
       title= "CD103 vs CD49a") + 
  coord_flip()

        #GO
up <- eup$GO_Biological_Process_2018
down <- edown$GO_Biological_Process_2018

up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 
  labs(subtitle="Combined scores from GO pathways", 
       title= "CD103 vs CD49a") + 
  coord_flip()

          

        #TRRUST
up <- eup$TRRUST_Transcription_Factors_2019
down <- edown$TRRUST_Transcription_Factors_2019
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from TRRUST pathways", 
       title= "CD103 vs CD49a") + 
  coord_flip()


        #TRANSFAC_and_JASPAR_PWMs
up <- eup$TRANSFAC_and_JASPAR_PWMs
down <- edown$TRANSFAC_and_JASPAR_PWMs
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from TRANSFAC_and_JASPAR_PWMs pathways", 
       title= "CD103 vs CD49a") + 
  coord_flip()


        #Transcription_Factor_PPIs
up <- eup$Transcription_Factor_PPIs
down <- edown$Transcription_Factor_PPIs
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from Transcription_Factor_PPIs pathways", 
       title= "CD103 vs CD49a") + 
  coord_flip()





#CD103vsDP

list_up <- c(upgenes.ihw.res.CD103vsDP)
list_down <- c(downgenes.ihw.res.CD103vsDP)


eup <- enrichr(list_up, dbs)
Uploading data to Enrichr... Done.
  Querying GO_Biological_Process_2018... Done.
  Querying KEGG_2019_Mouse... Done.
  Querying TRRUST_Transcription_Factors_2019... Done.
  Querying TRANSFAC_and_JASPAR_PWMs... Done.
  Querying Transcription_Factor_PPIs... Done.
  Querying Reactome_2016... Done.
Parsing results... Done.
edown <- enrichr(list_down, dbs)
Uploading data to Enrichr... Done.
  Querying GO_Biological_Process_2018... Done.
  Querying KEGG_2019_Mouse... Done.
  Querying TRRUST_Transcription_Factors_2019... Done.
  Querying TRANSFAC_and_JASPAR_PWMs... Done.
  Querying Transcription_Factor_PPIs... Done.
  Querying Reactome_2016... Done.
Parsing results... Done.
up <- eup$KEGG_2019_Mouse
down <- edown$KEGG_2019_Mouse
        #kegg
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from Kegg pathways", 
       title= "CD103 vs DP") + 
  coord_flip()

        #GO
up <- eup$GO_Biological_Process_2018
down <- edown$GO_Biological_Process_2018

up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from GO pathways", 
       title= "CD103 vs DP") + 
  coord_flip()



#TRRUST
#THIS HAS NO UP OR DOWN REGULATED PATHWAYS 
up <- eup$TRRUST_Transcription_Factors_2019
down <- edown$TRRUST_Transcription_Factors_2019
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from TRRUST pathways", 
       title= "CD103 vs DP") + 
  coord_flip()


        #TRANSFAC_and_JASPAR_PWMs
up <- eup$TRANSFAC_and_JASPAR_PWMs
down <- edown$TRANSFAC_and_JASPAR_PWMs
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from TRANSFAC_and_JASPAR_PWMs pathways", 
       title= "CD103 vs DP") + 
  coord_flip()


        #Transcription_Factor_PPIs
up <- eup$Transcription_Factor_PPIs
down <- edown$Transcription_Factor_PPIs
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from Transcription_Factor_PPIs pathways", 
       title= "CD103 vs DP") + 
  coord_flip()





#CD103vsDN

list_up <- c(upgenes.ihw.res.CD103vsDN)
list_down <- c(downgenes.ihw.res.CD103vsDN)


eup <- enrichr(list_up, dbs)
Uploading data to Enrichr... Done.
  Querying GO_Biological_Process_2018... Done.
  Querying KEGG_2019_Mouse... Done.
  Querying TRRUST_Transcription_Factors_2019... Done.
  Querying TRANSFAC_and_JASPAR_PWMs... Done.
  Querying Transcription_Factor_PPIs... Done.
  Querying Reactome_2016... Done.
Parsing results... Done.
edown <- enrichr(list_down, dbs)
Uploading data to Enrichr... Done.
  Querying GO_Biological_Process_2018... Done.
  Querying KEGG_2019_Mouse... Done.
  Querying TRRUST_Transcription_Factors_2019... Done.
  Querying TRANSFAC_and_JASPAR_PWMs... Done.
  Querying Transcription_Factor_PPIs... Done.
  Querying Reactome_2016... Done.
Parsing results... Done.
up <- eup$KEGG_2019_Mouse
down <- edown$KEGG_2019_Mouse
        #kegg
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from Kegg pathways", 
       title= "CD103 vs DN") + 
  coord_flip()

        #GO
up <- eup$GO_Biological_Process_2018
down <- edown$GO_Biological_Process_2018

up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from GO pathways", 
       title= "CD103 vs DN") + 
  coord_flip()


#TRRUST

up <- eup$TRRUST_Transcription_Factors_2019
down <- edown$TRRUST_Transcription_Factors_2019
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from TRRUST pathways", 
       title= "CD103 vs DN") + 
  coord_flip()


        #TRANSFAC_and_JASPAR_PWMs
up <- eup$TRANSFAC_and_JASPAR_PWMs
down <- edown$TRANSFAC_and_JASPAR_PWMs
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from TRANSFAC_and_JASPAR_PWMs pathways", 
       title= "CD103 vs DN") + 
  coord_flip()


        #Transcription_Factor_PPIs
up <- eup$Transcription_Factor_PPIs
down <- edown$Transcription_Factor_PPIs
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from Transcription_Factor_PPIs pathways", 
       title= "CD103 vs DN") + 
  coord_flip()






#CD49a vs DP

list_up <- c(upgenes.ihw.res.CD49avsDP)
list_down <- c(downgenes.ihw.res.CD49avsDP)


eup <- enrichr(list_up, dbs)
Uploading data to Enrichr... Done.
  Querying GO_Biological_Process_2018... Done.
  Querying KEGG_2019_Mouse... Done.
  Querying TRRUST_Transcription_Factors_2019... Done.
  Querying TRANSFAC_and_JASPAR_PWMs... Done.
  Querying Transcription_Factor_PPIs... Done.
  Querying Reactome_2016... Done.
Parsing results... Done.
edown <- enrichr(list_down, dbs)
Uploading data to Enrichr... Done.
  Querying GO_Biological_Process_2018... Done.
  Querying KEGG_2019_Mouse... Done.
  Querying TRRUST_Transcription_Factors_2019... Done.
  Querying TRANSFAC_and_JASPAR_PWMs... Done.
  Querying Transcription_Factor_PPIs... Done.
  Querying Reactome_2016... Done.
Parsing results... Done.
up <- eup$KEGG_2019_Mouse
down <- edown$KEGG_2019_Mouse
        #kegg
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from Kegg pathways", 
       title= "CD49a vs DP") + 
  coord_flip()

        #GO
up <- eup$GO_Biological_Process_2018
down <- edown$GO_Biological_Process_2018

up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from GO pathways", 
       title= "CD49a vs DP") + 
  coord_flip()




#TRRUST
up <- eup$TRRUST_Transcription_Factors_2019
down <- edown$TRRUST_Transcription_Factors_2019
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from TRRUST pathways", 
       title= "CD49a vs DP") + 
  coord_flip()


        #TRANSFAC_and_JASPAR_PWMs
up <- eup$TRANSFAC_and_JASPAR_PWMs
down <- edown$TRANSFAC_and_JASPAR_PWMs
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from TRANSFAC_and_JASPAR_PWMs pathways", 
       title= "CD49a vs DP") + 
  coord_flip()


        #Transcription_Factor_PPIs
up <- eup$Transcription_Factor_PPIs
down <- edown$Transcription_Factor_PPIs
#up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from Transcription_Factor_PPIs pathways", 
       title= "CD49a vs DP") + 
  coord_flip()




#CD49a vs DN

list_up <- c(upgenes.ihw.res.CD49avsDN)
list_down <- c(downgenes.ihw.res.CD49avsDN)


eup <- enrichr(list_up, dbs)
Uploading data to Enrichr... Done.
  Querying GO_Biological_Process_2018... Done.
  Querying KEGG_2019_Mouse... Done.
  Querying TRRUST_Transcription_Factors_2019... Done.
  Querying TRANSFAC_and_JASPAR_PWMs... Done.
  Querying Transcription_Factor_PPIs... Done.
  Querying Reactome_2016... Done.
Parsing results... Done.
edown <- enrichr(list_down, dbs)
Uploading data to Enrichr... Done.
  Querying GO_Biological_Process_2018... Done.
  Querying KEGG_2019_Mouse... Done.
  Querying TRRUST_Transcription_Factors_2019... Done.
  Querying TRANSFAC_and_JASPAR_PWMs... Done.
  Querying Transcription_Factor_PPIs... Done.
  Querying Reactome_2016... Done.
Parsing results... Done.
up <- eup$KEGG_2019_Mouse
down <- edown$KEGG_2019_Mouse
        #kegg
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from Kegg pathways", 
       title= "CD49a vs DN") + 
  coord_flip()

        #GO
up <- eup$GO_Biological_Process_2018
down <- edown$GO_Biological_Process_2018

up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from GO pathways", 
       title= "CD49a vs DN") + 
  coord_flip()




#TRRUST
up <- eup$TRRUST_Transcription_Factors_2019
down <- edown$TRRUST_Transcription_Factors_2019
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from TRRUST pathways", 
       title= "CD49a vs DN") + 
  coord_flip()


        #TRANSFAC_and_JASPAR_PWMs
up <- eup$TRANSFAC_and_JASPAR_PWMs
down <- edown$TRANSFAC_and_JASPAR_PWMs
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from TRANSFAC_and_JASPAR_PWMs pathways", 
       title= "CD49a vs DN") + 
  coord_flip()


        #Transcription_Factor_PPIs
up <- eup$Transcription_Factor_PPIs
down <- edown$Transcription_Factor_PPIs
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from Transcription_Factor_PPIs pathways", 
       title= "CD49a vs DN") + 
  coord_flip()





#DP vs DN

list_up <- c(upgenes.ihw.res.DPvsDN)
list_down <- c(downgenes.ihw.res.DPvsDN)


eup <- enrichr(list_up, dbs)
Uploading data to Enrichr... Done.
  Querying GO_Biological_Process_2018... Done.
  Querying KEGG_2019_Mouse... Done.
  Querying TRRUST_Transcription_Factors_2019... Done.
  Querying TRANSFAC_and_JASPAR_PWMs... Done.
  Querying Transcription_Factor_PPIs... Done.
  Querying Reactome_2016... Done.
Parsing results... Done.
edown <- enrichr(list_down, dbs)
Uploading data to Enrichr... Done.
  Querying GO_Biological_Process_2018... Done.
  Querying KEGG_2019_Mouse... Done.
  Querying TRRUST_Transcription_Factors_2019... Done.
  Querying TRANSFAC_and_JASPAR_PWMs... Done.
  Querying Transcription_Factor_PPIs... Done.
  Querying Reactome_2016... Done.
Parsing results... Done.
up <- eup$KEGG_2019_Mouse
down <- edown$KEGG_2019_Mouse
        #kegg
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from Kegg pathways", 
       title= "DP vs DN") + 
  coord_flip()

        #GO
up <- eup$GO_Biological_Process_2018
down <- edown$GO_Biological_Process_2018

up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from GO pathways", 
       title= "DP vs DN") + 
  coord_flip()


#TRRUST
up <- eup$TRRUST_Transcription_Factors_2019
down <- edown$TRRUST_Transcription_Factors_2019
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from TRRUST pathways", 
       title= "DP vs DN") + 
  coord_flip()


        #TRANSFAC_and_JASPAR_PWMs
up <- eup$TRANSFAC_and_JASPAR_PWMs
down <- edown$TRANSFAC_and_JASPAR_PWMs
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from TRANSFAC_and_JASPAR_PWMs pathways", 
       title= "DP vs DN") + 
  coord_flip()


        #Transcription_Factor_PPIs
up <- eup$Transcription_Factor_PPIs
down <- edown$Transcription_Factor_PPIs
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from Transcription_Factor_PPIs pathways", 
       title= "DP vs DN") + 
  coord_flip()



  #Reactome
up <- eup$Reactome_2016
down <- edown$Reactome_2016
up$type <- "up"
down$type <- "down"
up <- up[up$Adjusted.P.value<.05,]
up <- up[order(up$Combined.Score), ]  # sort
down <- down[down$Adjusted.P.value<0.05,]
down <- down[order(down$Combined.Score), ]  # sort
down$Combined.Score <- (-1) * down$Combined.Score
gos <- rbind(down,up)
gos <- na.omit(gos) # Diverging Barcharts
ggplot(gos, aes(x=reorder(Term,Combined.Score), y=Combined.Score , label=Combined.Score)) + 
  geom_bar(stat='identity', aes(fill=Adjusted.P.value), width=.5,position="dodge")  +
  scale_fill_viridis() + 


  labs(subtitle="Combined scores from Reactome_2016 pathways", 
       title= "DP vs DN") + 
  coord_flip()

#to write csvs of dp vs dn genes, we need to rewrite eup and edown as we did above
list_up <- c(upgenes.ihw.res.DPvsDN)
list_down <- c(downgenes.ihw.res.DPvsDN)
eup <- enrichr(list_up, dbs)
Uploading data to Enrichr... Done.
  Querying GO_Biological_Process_2018... Done.
  Querying KEGG_2019_Mouse... Done.
  Querying TRRUST_Transcription_Factors_2019... Done.
  Querying TRANSFAC_and_JASPAR_PWMs... Done.
  Querying Transcription_Factor_PPIs... Done.
  Querying Reactome_2016... Done.
Parsing results... Done.
edown <- enrichr(list_down, dbs)
Uploading data to Enrichr... Done.
  Querying GO_Biological_Process_2018... Done.
  Querying KEGG_2019_Mouse... Done.
  Querying TRRUST_Transcription_Factors_2019... Done.
  Querying TRANSFAC_and_JASPAR_PWMs... Done.
  Querying Transcription_Factor_PPIs... Done.
  Querying Reactome_2016... Done.
Parsing results... Done.
#write csvs of the dp vs dn gene set enrichment analysies
#up
write.csv(eup$KEGG_2019_Mouse,'upkeggdpdn.csv')
write.csv(eup$GO_Biological_Process_2018,'upgodpdn.csv')
write.csv(eup$TRRUST_Transcription_Factors_2019,'uptrrustdpdn.csv')
write.csv(eup$TRANSFAC_and_JASPAR_PWMs,'uptransfacdpdn.csv')
write.csv(eup$Transcription_Factor_PPIs,'uptfppisdpdn.csv')
write.csv(eup$Reactome_2016,'upreactomedpdn.csv')
#down
write.csv(edown$KEGG_2019_Mouse,'downkeggdpdn.csv')
write.csv(edown$GO_Biological_Process_2018,'downgodpdn.csv')
write.csv(edown$TRRUST_Transcription_Factors_2019,'downtrrustdpdn.csv')
write.csv(edown$TRANSFAC_and_JASPAR_PWMs,'downtransfacdpdn.csv')
write.csv(edown$Transcription_Factor_PPIs,'downtfppisdpdn.csv')
write.csv(edown$Reactome_2016,'downreactomedpdn.csv')
#make venn diagram to look at upregulated genes. What number of genes are upregulated in which comparisons?
library(VennDiagram)
Loading required package: grid
Loading required package: futile.logger

Attaching package: 㤼㸱VennDiagram㤼㸲

The following object is masked from 㤼㸱package:dendextend㤼㸲:

    rotate
library(RColorBrewer)
viridis3<-viridis(n=3)
mycol <- c('#8744f6','#414141','#acfafa')
# venn.diagram(x=list(upgenes.ihw.res.DPvsDN,upgenes.ihw.res.CD49avsDN,upgenes.ihw.res.CD103vsDN),
#   category.names = c('','',''),
#   filename='stimupregulatedvennfinal.png',
#   output=T,  
#          # Output features
#         imagetype="png" ,
#         height = 2000 , 
#         width = 2000 , 
#         resolution = 1200,
#         compression = "lzw",
#         
#         # Circles
#         lwd = 1,
#         lty = c(1,1,1),
#         fill = mycol,
#   col=c('#222222','#222222','#222222'),
#         alpha=c(.7,.8,.8),
#         
#         # Numbers
#         cex = .6,
#         fontface = "bold",
#         fontfamily = "sans",
#   )
## Examine plot of p-values to compare p value, adjusted p value, and weighted p value (Created b independent hypothesis testing. See above.)
viridispal3 <- viridis(n=3)
hist(res.CD103vsCD49aDF$pvalue, breaks=50, col="#440154FF")

hist(res.CD103vsDPDF$pvalue, breaks=50, col="#440154FF")

hist(res.CD103vsDNDF$pvalue, breaks=50, col="#440154FF")

hist(res.CD49avsDPDF$pvalue, breaks=50, col="#440154FF")

hist(res.CD49avsDNDF$pvalue, breaks=50, col="#440154FF")

hist(res.DPvsDNDF$pvalue, breaks=50, col="#440154FF")


hist(res.CD103vsCD49aDF$padj, breaks=50, col="#21908CFF")

hist(res.CD103vsDPDF$padj, breaks=50, col="#21908CFF")

hist(res.CD103vsDNDF$padj, breaks=50, col="#21908CFF")

hist(res.CD49avsDPDF$padj, breaks=50, col="#21908CFF")

hist(res.CD49avsDNDF$padj, breaks=50, col="#21908CFF")

hist(res.DPvsDNDF$padj, breaks=50, col="#21908CFF")


hist(ihw.res.CD103vsCD49a.all$weighted_pvalue, breaks=50, col="#FDE725FF")

hist(ihw.res.CD103vsDP.all$weighted_pvalue, breaks=50, col="#FDE725FF")

hist(ihw.res.CD103vsDN.all$weighted_pvalue, breaks=50, col="#FDE725FF")

hist(ihw.res.CD49avsDP.all$weighted_pvalue, breaks=50, col="#FDE725FF")

hist(ihw.res.CD49avsDN.all$weighted_pvalue, breaks=50, col="#FDE725FF")

hist(ihw.res.DPvsDN.all$weighted_pvalue, breaks=50, col="#FDE725FF")

#sessioninfo
sessionInfo()
R version 4.0.5 (2021-03-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19042)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
 [1] grid      parallel  stats4    stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] VennDiagram_1.6.20          futile.logger_1.4.3         enrichR_3.0                
 [4] EnhancedVolcano_1.8.0       ggrepel_0.9.1               IHW_1.18.0                 
 [7] ashr_2.2-47                 tibble_3.1.2                dplyr_1.0.6                
[10] corrplot_0.90               gplots_3.1.1                RColorBrewer_1.1-2         
[13] gridExtra_2.3               factoextra_1.0.7            FactoMineR_2.4             
[16] ggplot2_3.3.5               viridis_0.6.1               viridisLite_0.4.0          
[19] dendextend_1.15.1           DESeq2_1.30.1               SummarizedExperiment_1.20.0
[22] Biobase_2.50.0              MatrixGenerics_1.2.1        matrixStats_0.58.0         
[25] GenomicRanges_1.42.0        GenomeInfoDb_1.26.7         IRanges_2.24.1             
[28] S4Vectors_0.28.1            BiocGenerics_0.36.1        

loaded via a namespace (and not attached):
 [1] ggbeeswarm_0.6.0       colorspace_2.0-1       rjson_0.2.20           ellipsis_0.3.2        
 [5] XVector_0.30.0         farver_2.1.0           DT_0.18                bit64_4.0.5           
 [9] AnnotationDbi_1.52.0   fansi_0.5.0            splines_4.0.5          leaps_3.1             
[13] extrafont_0.17         cachem_1.0.5           geneplotter_1.68.0     knitr_1.33            
[17] jsonlite_1.7.2         packrat_0.6.0          Rttf2pt1_1.3.9         annotate_1.68.0       
[21] cluster_2.1.1          compiler_4.0.5         httr_1.4.2             assertthat_0.2.1      
[25] Matrix_1.3-2           fastmap_1.1.0          formatR_1.11           htmltools_0.5.1.1     
[29] tools_4.0.5            gtable_0.3.0           glue_1.4.2             GenomeInfoDbData_1.2.4
[33] maps_3.3.0             Rcpp_1.0.6             slam_0.1-48            vctrs_0.3.8           
[37] ggalt_0.4.0            extrafontdb_1.0        xfun_0.24              lifecycle_1.0.0       
[41] irlba_2.3.3            gtools_3.9.2           XML_3.99-0.6           zlibbioc_1.36.0       
[45] MASS_7.3-53.1          scales_1.1.1           ragg_1.1.3             proj4_1.0-10.1        
[49] lambda.r_1.2.4         curl_4.3.2             memoise_2.0.0          ggrastr_0.2.3         
[53] RSQLite_2.2.7          SQUAREM_2021.1         genefilter_1.72.1      caTools_1.18.2        
[57] BiocParallel_1.24.1    truncnorm_1.0-8        rlang_0.4.11           pkgconfig_2.0.3       
[61] systemfonts_1.0.2      bitops_1.0-7           evaluate_0.14          lattice_0.20-41       
[65] invgamma_1.1           lpsymphony_1.18.0      purrr_0.3.4            htmlwidgets_1.5.3     
[69] labeling_0.4.2         bit_4.0.4              tidyselect_1.1.1       magrittr_2.0.1        
[73] R6_2.5.0               generics_0.1.0         DelayedArray_0.16.3    DBI_1.1.1             
[77] pillar_1.6.2           withr_2.4.2            survival_3.2-10        scatterplot3d_0.3-41  
[81] RCurl_1.98-1.3         mixsqp_0.3-43          ash_1.0-15             crayon_1.4.1          
[85] futile.options_1.0.1   fdrtool_1.2.16         KernSmooth_2.23-18     utf8_1.2.1            
[89] rmarkdown_2.9          locfit_1.5-9.4         blob_1.2.2             digest_0.6.27         
[93] flashClust_1.01-2      xtable_1.8-4           textshaping_0.3.5      munsell_0.5.0         
[97] beeswarm_0.4.0         vipor_0.4.5           
#citations, using a method as described in https://stackoverflow.com/questions/27535628/how-do-i-tell-which-r-packages-to-cite-in-my-paper 
packages_in_use <- c( sessionInfo()$basePkgs, names( sessionInfo()$loadedOnly ) )
the_citations_list <- lapply( X=packages_in_use, FUN=citation)
no date field in DESCRIPTION file of package 㤼㸱GenomeInfoDbData㤼㸲
the_citations_list
[[1]]

The ‘grid’ package is part of R.  To cite R in publications use:

  R Core Team (2021). R: A language and environment for statistical computing. R Foundation for
  Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2021},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it when using it for data
analysis. See also ‘citation("pkgname")’ for citing R packages.


[[2]]

The ‘parallel’ package is part of R.  To cite R in publications use:

  R Core Team (2021). R: A language and environment for statistical computing. R Foundation for
  Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2021},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it when using it for data
analysis. See also ‘citation("pkgname")’ for citing R packages.


[[3]]

The ‘stats4’ package is part of R.  To cite R in publications use:

  R Core Team (2021). R: A language and environment for statistical computing. R Foundation for
  Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2021},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it when using it for data
analysis. See also ‘citation("pkgname")’ for citing R packages.


[[4]]

The ‘stats’ package is part of R.  To cite R in publications use:

  R Core Team (2021). R: A language and environment for statistical computing. R Foundation for
  Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2021},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it when using it for data
analysis. See also ‘citation("pkgname")’ for citing R packages.


[[5]]

The ‘graphics’ package is part of R.  To cite R in publications use:

  R Core Team (2021). R: A language and environment for statistical computing. R Foundation for
  Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2021},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it when using it for data
analysis. See also ‘citation("pkgname")’ for citing R packages.


[[6]]

The ‘grDevices’ package is part of R.  To cite R in publications use:

  R Core Team (2021). R: A language and environment for statistical computing. R Foundation for
  Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2021},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it when using it for data
analysis. See also ‘citation("pkgname")’ for citing R packages.


[[7]]

The ‘utils’ package is part of R.  To cite R in publications use:

  R Core Team (2021). R: A language and environment for statistical computing. R Foundation for
  Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2021},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it when using it for data
analysis. See also ‘citation("pkgname")’ for citing R packages.


[[8]]

The ‘datasets’ package is part of R.  To cite R in publications use:

  R Core Team (2021). R: A language and environment for statistical computing. R Foundation for
  Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2021},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it when using it for data
analysis. See also ‘citation("pkgname")’ for citing R packages.


[[9]]

The ‘methods’ package is part of R.  To cite R in publications use:

  R Core Team (2021). R: A language and environment for statistical computing. R Foundation for
  Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2021},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it when using it for data
analysis. See also ‘citation("pkgname")’ for citing R packages.


[[10]]

To cite R in publications use:

  R Core Team (2021). R: A language and environment for statistical computing. R Foundation for
  Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2021},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it when using it for data
analysis. See also ‘citation("pkgname")’ for citing R packages.


[[11]]

To cite package ‘ggbeeswarm’ in publications use:

  Erik Clarke and Scott Sherrill-Mix (2017). ggbeeswarm: Categorical Scatter (Violin Point) Plots.
  R package version 0.6.0. https://CRAN.R-project.org/package=ggbeeswarm

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {ggbeeswarm: Categorical Scatter (Violin Point) Plots},
    author = {Erik Clarke and Scott Sherrill-Mix},
    year = {2017},
    note = {R package version 0.6.0},
    url = {https://CRAN.R-project.org/package=ggbeeswarm},
  }


[[12]]

To cite colorspace in publications use:

Zeileis A, Fisher JC, Hornik K, Ihaka R, McWhite CD, Murrell P, Stauffer R, Wilke CO (2020).
“colorspace: A Toolbox for Manipulating and Assessing Colors and Palettes.” _Journal of
Statistical Software_, *96*(1), 1-49. doi: 10.18637/jss.v096.i01 (URL:
https://doi.org/10.18637/jss.v096.i01).

If you use HCL-based color palettes, please cite:

Zeileis A, Hornik K, Murrell P (2009). “Escaping RGBland: Selecting Colors for Statistical
Graphics.” _Computational Statistics \& Data Analysis_, *53*(9), 3259-3270. doi:
10.1016/j.csda.2008.11.033 (URL: https://doi.org/10.1016/j.csda.2008.11.033).

If you use HCL-based color palettes in meteorological visualizations, please cite:

Stauffer R, Mayr GJ, Dabernig M, Zeileis A (2009). “Somewhere over the Rainbow: How to Make
Effective Use of Colors in Meteorological Visualizations.” _Bulletin of the American
Meteorological Society_, *96*(2), 203-216. doi: 10.1175/BAMS-D-13-00155.1 (URL:
https://doi.org/10.1175/BAMS-D-13-00155.1).

To see these entries in BibTeX format, use 'print(<citation>, bibtex=TRUE)', 'toBibtex(.)', or set
'options(citation.bibtex.max=999)'.


[[13]]

To cite package ‘rjson’ in publications use:

  Alex Couture-Beil (2018). rjson: JSON for R. R package version 0.2.20.
  https://CRAN.R-project.org/package=rjson

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {rjson: JSON for R},
    author = {Alex Couture-Beil},
    year = {2018},
    note = {R package version 0.2.20},
    url = {https://CRAN.R-project.org/package=rjson},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[14]]

To cite package ‘ellipsis’ in publications use:

  Hadley Wickham (2021). ellipsis: Tools for Working with .... R package version 0.3.2.
  https://CRAN.R-project.org/package=ellipsis

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {ellipsis: Tools for Working with ...},
    author = {Hadley Wickham},
    year = {2021},
    note = {R package version 0.3.2},
    url = {https://CRAN.R-project.org/package=ellipsis},
  }


[[15]]

To cite package ‘XVector’ in publications use:

  Hervé Pagès and Patrick Aboyoun (2020). XVector: Foundation of external vector representation
  and manipulation in Bioconductor. R package version 0.30.0.
  https://bioconductor.org/packages/XVector

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {XVector: Foundation of external vector representation and manipulation in
Bioconductor},
    author = {Hervé Pagès and Patrick Aboyoun},
    year = {2020},
    note = {R package version 0.30.0},
    url = {https://bioconductor.org/packages/XVector},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[16]]

To cite package ‘farver’ in publications use:

  Thomas Lin Pedersen, Berendea Nicolae and Romain François (2021). farver: High Performance
  Colour Space Manipulation. R package version 2.1.0. https://CRAN.R-project.org/package=farver

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {farver: High Performance Colour Space Manipulation},
    author = {Thomas Lin Pedersen and Berendea Nicolae and Romain François},
    year = {2021},
    note = {R package version 2.1.0},
    url = {https://CRAN.R-project.org/package=farver},
  }


[[17]]

To cite package ‘DT’ in publications use:

  Yihui Xie, Joe Cheng and Xianying Tan (2021). DT: A Wrapper of the JavaScript Library
  'DataTables'. R package version 0.18. https://CRAN.R-project.org/package=DT

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {DT: A Wrapper of the JavaScript Library 'DataTables'},
    author = {Yihui Xie and Joe Cheng and Xianying Tan},
    year = {2021},
    note = {R package version 0.18},
    url = {https://CRAN.R-project.org/package=DT},
  }


[[18]]

To cite package ‘bit64’ in publications use:

  Jens Oehlschlägel and Leonardo Silvestri (2020). bit64: A S3 Class for Vectors of 64bit
  Integers. R package version 4.0.5. https://CRAN.R-project.org/package=bit64

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {bit64: A S3 Class for Vectors of 64bit Integers},
    author = {Jens Oehlschlägel and Leonardo Silvestri},
    year = {2020},
    note = {R package version 4.0.5},
    url = {https://CRAN.R-project.org/package=bit64},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[19]]

To cite package ‘AnnotationDbi’ in publications use:

  Hervé Pagès, Marc Carlson, Seth Falcon and Nianhua Li (2020). AnnotationDbi: Manipulation of
  SQLite-based annotations in Bioconductor. R package version 1.52.0.
  https://bioconductor.org/packages/AnnotationDbi

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {AnnotationDbi: Manipulation of SQLite-based annotations in Bioconductor},
    author = {Hervé Pagès and Marc Carlson and Seth Falcon and Nianhua Li},
    year = {2020},
    note = {R package version 1.52.0},
    url = {https://bioconductor.org/packages/AnnotationDbi},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[20]]

To cite package ‘fansi’ in publications use:

  Brodie Gaslam (2021). fansi: ANSI Control Sequence Aware String Functions. R package version
  0.5.0. https://CRAN.R-project.org/package=fansi

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {fansi: ANSI Control Sequence Aware String Functions},
    author = {Brodie Gaslam},
    year = {2021},
    note = {R package version 0.5.0},
    url = {https://CRAN.R-project.org/package=fansi},
  }


[[21]]

The ‘splines’ package is part of R.  To cite R in publications use:

  R Core Team (2021). R: A language and environment for statistical computing. R Foundation for
  Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2021},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it when using it for data
analysis. See also ‘citation("pkgname")’ for citing R packages.


[[22]]

To cite package ‘leaps’ in publications use:

  Thomas Lumley based on Fortran code by Alan Miller (2020). leaps: Regression Subset Selection. R
  package version 3.1. https://CRAN.R-project.org/package=leaps

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {leaps: Regression Subset Selection},
    author = {Thomas Lumley based on Fortran code by Alan Miller},
    year = {2020},
    note = {R package version 3.1},
    url = {https://CRAN.R-project.org/package=leaps},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[23]]

To cite package ‘extrafont’ in publications use:

  Winston Chang, (2014). extrafont: Tools for using fonts. R package version 0.17.
  https://CRAN.R-project.org/package=extrafont

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {extrafont: Tools for using fonts},
    author = {Winston Chang,},
    year = {2014},
    note = {R package version 0.17},
    url = {https://CRAN.R-project.org/package=extrafont},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[24]]

To cite package ‘cachem’ in publications use:

  Winston Chang (2021). cachem: Cache R Objects with Automatic Pruning. R package version 1.0.5.
  https://CRAN.R-project.org/package=cachem

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {cachem: Cache R Objects with Automatic Pruning},
    author = {Winston Chang},
    year = {2021},
    note = {R package version 1.0.5},
    url = {https://CRAN.R-project.org/package=cachem},
  }


[[25]]

To cite package ‘geneplotter’ in publications use:

  R. Gentleman and Biocore (2020). geneplotter: Graphics related functions for Bioconductor. R
  package version 1.68.0.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {geneplotter: Graphics related functions for Bioconductor},
    author = {R. Gentleman and {Biocore}},
    year = {2020},
    note = {R package version 1.68.0},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[26]]

To cite the 'knitr' package in publications use:

  Yihui Xie (2021). knitr: A General-Purpose Package for Dynamic Report Generation in R. R package
  version 1.33.

  Yihui Xie (2015) Dynamic Documents with R and knitr. 2nd edition. Chapman and Hall/CRC. ISBN
  978-1498716963

  Yihui Xie (2014) knitr: A Comprehensive Tool for Reproducible Research in R. In Victoria
  Stodden, Friedrich Leisch and Roger D. Peng, editors, Implementing Reproducible Computational
  Research. Chapman and Hall/CRC. ISBN 978-1466561595

To see these entries in BibTeX format, use 'print(<citation>, bibtex=TRUE)', 'toBibtex(.)', or set
'options(citation.bibtex.max=999)'.


[[27]]

To cite jsonlite in publications use:

  Jeroen Ooms (2014). The jsonlite Package: A Practical and Consistent Mapping Between JSON Data
  and R Objects. arXiv:1403.2805 [stat.CO] URL https://arxiv.org/abs/1403.2805.

A BibTeX entry for LaTeX users is

  @Article{,
    title = {The jsonlite Package: A Practical and Consistent Mapping Between JSON Data and R Objects},
    author = {Jeroen Ooms},
    journal = {arXiv:1403.2805 [stat.CO]},
    year = {2014},
    url = {https://arxiv.org/abs/1403.2805},
  }


[[28]]

To cite package ‘packrat’ in publications use:

  Kevin Ushey, Jonathan McPherson, Joe Cheng, Aron Atkins and JJ Allaire (2021). packrat: A
  Dependency Management System for Projects and their R Package Dependencies. R package version
  0.6.0. https://CRAN.R-project.org/package=packrat

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {packrat: A Dependency Management System for Projects and their R Package
Dependencies},
    author = {Kevin Ushey and Jonathan McPherson and Joe Cheng and Aron Atkins and JJ Allaire},
    year = {2021},
    note = {R package version 0.6.0},
    url = {https://CRAN.R-project.org/package=packrat},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[29]]

To cite package ‘Rttf2pt1’ in publications use:

  Winston Chang, Andrew Weeks, Frank M. Siegert, Mark Heath, Thomas Henlick, Sergey Babkin, Turgut
  Uyar, Rihardas Hepas, Szalay Tamas, Johan Vromans, Petr Titera, Lei Wang, Chen Xiangyang,
  Zvezdan Petkovic, Rigel and I. Lee Hetherington (2021). Rttf2pt1: 'ttf2pt1' Program. R package
  version 1.3.9. https://CRAN.R-project.org/package=Rttf2pt1

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {Rttf2pt1: 'ttf2pt1' Program},
    author = {Winston Chang and Andrew Weeks and Frank M. Siegert and Mark Heath and Thomas Henlick and Sergey Babkin and Turgut Uyar and Rihardas Hepas and Szalay Tamas and Johan Vromans and Petr Titera and Lei Wang and Chen Xiangyang and Zvezdan Petkovic and {Rigel} and I. Lee Hetherington},
    year = {2021},
    note = {R package version 1.3.9},
    url = {https://CRAN.R-project.org/package=Rttf2pt1},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[30]]

To cite package ‘annotate’ in publications use:

  R. Gentleman (2020). annotate: Annotation for microarrays. R package version 1.68.0.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {annotate: Annotation for microarrays},
    author = {R. Gentleman},
    year = {2020},
    note = {R package version 1.68.0},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[31]]

To cite the R package 'cluster' in publications use:

  Maechler, M., Rousseeuw, P., Struyf, A., Hubert, M., Hornik, K.(2021).  cluster: Cluster
  Analysis Basics and Extensions. R package version 2.1.1.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {cluster: Cluster Analysis Basics and Extensions},
    author = {Martin Maechler and Peter Rousseeuw and Anja Struyf and Mia Hubert and Kurt Hornik},
    year = {2021},
    url = {https://CRAN.R-project.org/package=cluster},
    note = {R package version 2.1.1 --- For new features, see the 'Changelog' file (in the package source)},
  }


[[32]]

The ‘compiler’ package is part of R.  To cite R in publications use:

  R Core Team (2021). R: A language and environment for statistical computing. R Foundation for
  Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2021},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it when using it for data
analysis. See also ‘citation("pkgname")’ for citing R packages.


[[33]]

To cite package ‘httr’ in publications use:

  Hadley Wickham (2020). httr: Tools for Working with URLs and HTTP. R package version 1.4.2.
  https://CRAN.R-project.org/package=httr

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {httr: Tools for Working with URLs and HTTP},
    author = {Hadley Wickham},
    year = {2020},
    note = {R package version 1.4.2},
    url = {https://CRAN.R-project.org/package=httr},
  }


[[34]]

To cite package ‘assertthat’ in publications use:

  Hadley Wickham (2019). assertthat: Easy Pre and Post Assertions. R package version 0.2.1.
  https://CRAN.R-project.org/package=assertthat

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {assertthat: Easy Pre and Post Assertions},
    author = {Hadley Wickham},
    year = {2019},
    note = {R package version 0.2.1},
    url = {https://CRAN.R-project.org/package=assertthat},
  }


[[35]]

To cite package ‘Matrix’ in publications use:

  Douglas Bates and Martin Maechler (2021). Matrix: Sparse and Dense Matrix Classes and Methods. R
  package version 1.3-2. https://CRAN.R-project.org/package=Matrix

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {Matrix: Sparse and Dense Matrix Classes and Methods},
    author = {Douglas Bates and Martin Maechler},
    year = {2021},
    note = {R package version 1.3-2},
    url = {https://CRAN.R-project.org/package=Matrix},
  }


[[36]]

To cite package ‘fastmap’ in publications use:

  Winston Chang (2021). fastmap: Fast Data Structures. R package version 1.1.0.
  https://CRAN.R-project.org/package=fastmap

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {fastmap: Fast Data Structures},
    author = {Winston Chang},
    year = {2021},
    note = {R package version 1.1.0},
    url = {https://CRAN.R-project.org/package=fastmap},
  }


[[37]]

To cite package ‘formatR’ in publications use:

  Yihui Xie (2021). formatR: Format R Code Automatically. R package version 1.11.
  https://CRAN.R-project.org/package=formatR

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {formatR: Format R Code Automatically},
    author = {Yihui Xie},
    year = {2021},
    note = {R package version 1.11},
    url = {https://CRAN.R-project.org/package=formatR},
  }


[[38]]

To cite package ‘htmltools’ in publications use:

  Joe Cheng, Carson Sievert, Winston Chang, Yihui Xie and Jeff Allen (2021). htmltools: Tools for
  HTML. R package version 0.5.1.1. https://CRAN.R-project.org/package=htmltools

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {htmltools: Tools for HTML},
    author = {Joe Cheng and Carson Sievert and Winston Chang and Yihui Xie and Jeff Allen},
    year = {2021},
    note = {R package version 0.5.1.1},
    url = {https://CRAN.R-project.org/package=htmltools},
  }


[[39]]

The ‘tools’ package is part of R.  To cite R in publications use:

  R Core Team (2021). R: A language and environment for statistical computing. R Foundation for
  Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2021},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it when using it for data
analysis. See also ‘citation("pkgname")’ for citing R packages.


[[40]]

To cite package ‘gtable’ in publications use:

  Hadley Wickham and Thomas Lin Pedersen (2019). gtable: Arrange 'Grobs' in Tables. R package
  version 0.3.0. https://CRAN.R-project.org/package=gtable

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {gtable: Arrange 'Grobs' in Tables},
    author = {Hadley Wickham and Thomas Lin Pedersen},
    year = {2019},
    note = {R package version 0.3.0},
    url = {https://CRAN.R-project.org/package=gtable},
  }


[[41]]

To cite package ‘glue’ in publications use:

  Jim Hester (2020). glue: Interpreted String Literals. R package version 1.4.2.
  https://CRAN.R-project.org/package=glue

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {glue: Interpreted String Literals},
    author = {Jim Hester},
    year = {2020},
    note = {R package version 1.4.2},
    url = {https://CRAN.R-project.org/package=glue},
  }


[[42]]

To cite package ‘GenomeInfoDbData’ in publications use:

  Bioconductor Core Team (2020). GenomeInfoDbData: Species and taxonomy ID look up tables used by
  GenomeInfoDb. R package version 1.2.4.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {GenomeInfoDbData: Species and taxonomy ID look up tables used by GenomeInfoDb},
    author = {Bioconductor Core Team},
    year = {2020},
    note = {R package version 1.2.4},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[43]]

To cite package ‘maps’ in publications use:

  Original S code by Richard A. Becker, Allan R. Wilks. R version by Ray Brownrigg. Enhancements
  by Thomas P Minka and Alex Deckmyn. (2018). maps: Draw Geographical Maps. R package version
  3.3.0. https://CRAN.R-project.org/package=maps

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {maps: Draw Geographical Maps},
    author = {Original S code by Richard A. Becker and Allan R. Wilks. R version by Ray Brownrigg. Enhancements by Thomas P Minka and Alex Deckmyn.},
    year = {2018},
    note = {R package version 3.3.0},
    url = {https://CRAN.R-project.org/package=maps},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[44]]

To cite Rcpp in publications use:

  Dirk Eddelbuettel and Romain Francois (2011). Rcpp: Seamless R and C++ Integration. Journal of
  Statistical Software, 40(8), 1-18. URL https://www.jstatsoft.org/v40/i08/.

  Eddelbuettel, Dirk (2013) Seamless R and C++ Integration with Rcpp. Springer, New York. ISBN
  978-1-4614-6867-7.

  Dirk Eddelbuettel and James Joseph Balamuta (2018). Extending R with C++: A Brief Introduction
  to Rcpp. The American Statistician. 72(1). URL https://doi.org/10.1080/00031305.2017.1375990.

To see these entries in BibTeX format, use 'print(<citation>, bibtex=TRUE)', 'toBibtex(.)', or set
'options(citation.bibtex.max=999)'.


[[45]]

To cite package ‘slam’ in publications use:

  Kurt Hornik, David Meyer and Christian Buchta (2020). slam: Sparse Lightweight Arrays and
  Matrices. R package version 0.1-48. https://CRAN.R-project.org/package=slam

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {slam: Sparse Lightweight Arrays and Matrices},
    author = {Kurt Hornik and David Meyer and Christian Buchta},
    year = {2020},
    note = {R package version 0.1-48},
    url = {https://CRAN.R-project.org/package=slam},
  }


[[46]]

To cite package ‘vctrs’ in publications use:

  Hadley Wickham, Lionel Henry and Davis Vaughan (2021). vctrs: Vector Helpers. R package version
  0.3.8. https://CRAN.R-project.org/package=vctrs

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {vctrs: Vector Helpers},
    author = {Hadley Wickham and Lionel Henry and Davis Vaughan},
    year = {2021},
    note = {R package version 0.3.8},
    url = {https://CRAN.R-project.org/package=vctrs},
  }


[[47]]

To cite package ‘ggalt’ in publications use:

  Bob Rudis, Ben Bolker and Jan Schulz (2017). ggalt: Extra Coordinate Systems, 'Geoms',
  Statistical Transformations, Scales and Fonts for 'ggplot2'. R package version 0.4.0.
  https://CRAN.R-project.org/package=ggalt

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {ggalt: Extra Coordinate Systems, 'Geoms', Statistical Transformations,
Scales and Fonts for 'ggplot2'},
    author = {Bob Rudis and Ben Bolker and Jan Schulz},
    year = {2017},
    note = {R package version 0.4.0},
    url = {https://CRAN.R-project.org/package=ggalt},
  }


[[48]]

To cite package ‘extrafontdb’ in publications use:

  Winston Chang (2012). extrafontdb: Package for holding the database for the extrafont package. R
  package version 1.0. https://CRAN.R-project.org/package=extrafontdb

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {extrafontdb: Package for holding the database for the extrafont package},
    author = {Winston Chang},
    year = {2012},
    note = {R package version 1.0},
    url = {https://CRAN.R-project.org/package=extrafontdb},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[49]]

To cite package ‘xfun’ in publications use:

  Yihui Xie (2021). xfun: Supporting Functions for Packages Maintained by 'Yihui Xie'. R package
  version 0.24. https://CRAN.R-project.org/package=xfun

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {xfun: Supporting Functions for Packages Maintained by 'Yihui Xie'},
    author = {Yihui Xie},
    year = {2021},
    note = {R package version 0.24},
    url = {https://CRAN.R-project.org/package=xfun},
  }


[[50]]

To cite package ‘lifecycle’ in publications use:

  Lionel Henry and Hadley Wickham (2021). lifecycle: Manage the Life Cycle of your Package
  Functions. R package version 1.0.0. https://CRAN.R-project.org/package=lifecycle

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {lifecycle: Manage the Life Cycle of your Package Functions},
    author = {Lionel Henry and Hadley Wickham},
    year = {2021},
    note = {R package version 1.0.0},
    url = {https://CRAN.R-project.org/package=lifecycle},
  }


[[51]]

To cite package ‘irlba’ in publications use:

  Jim Baglama, Lothar Reichel and B. W. Lewis (2019). irlba: Fast Truncated Singular Value
  Decomposition and Principal Components Analysis for Large Dense and Sparse Matrices. R package
  version 2.3.3. https://CRAN.R-project.org/package=irlba

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {irlba: Fast Truncated Singular Value Decomposition and Principal
Components Analysis for Large Dense and Sparse Matrices},
    author = {Jim Baglama and Lothar Reichel and B. W. Lewis},
    year = {2019},
    note = {R package version 2.3.3},
    url = {https://CRAN.R-project.org/package=irlba},
  }


[[52]]

To cite package ‘gtools’ in publications use:

  Gregory R. Warnes, Ben Bolker and Thomas Lumley (2021). gtools: Various R Programming Tools. R
  package version 3.9.2. https://CRAN.R-project.org/package=gtools

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {gtools: Various R Programming Tools},
    author = {Gregory R. Warnes and Ben Bolker and Thomas Lumley},
    year = {2021},
    note = {R package version 3.9.2},
    url = {https://CRAN.R-project.org/package=gtools},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[53]]

To cite package ‘XML’ in publications use:

  Duncan Temple Lang (2021). XML: Tools for Parsing and Generating XML Within R and S-Plus. R
  package version 3.99-0.6. https://CRAN.R-project.org/package=XML

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {XML: Tools for Parsing and Generating XML Within R and S-Plus},
    author = {Duncan {Temple Lang}},
    year = {2021},
    note = {R package version 3.99-0.6},
    url = {https://CRAN.R-project.org/package=XML},
  }


[[54]]

To cite package ‘zlibbioc’ in publications use:

  Martin Morgan (2020). zlibbioc: An R packaged zlib-1.2.5. R package version 1.36.0.
  https://bioconductor.org/packages/zlibbioc

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {zlibbioc: An R packaged zlib-1.2.5},
    author = {Martin Morgan},
    year = {2020},
    note = {R package version 1.36.0},
    url = {https://bioconductor.org/packages/zlibbioc},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[55]]

To cite the MASS package in publications use:

  Venables, W. N. & Ripley, B. D. (2002) Modern Applied Statistics with S. Fourth Edition.
  Springer, New York. ISBN 0-387-95457-0

A BibTeX entry for LaTeX users is

  @Book{,
    title = {Modern Applied Statistics with S},
    author = {W. N. Venables and B. D. Ripley},
    publisher = {Springer},
    edition = {Fourth},
    address = {New York},
    year = {2002},
    note = {ISBN 0-387-95457-0},
    url = {https://www.stats.ox.ac.uk/pub/MASS4/},
  }


[[56]]

To cite package ‘scales’ in publications use:

  Hadley Wickham and Dana Seidel (2020). scales: Scale Functions for Visualization. R package
  version 1.1.1. https://CRAN.R-project.org/package=scales

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {scales: Scale Functions for Visualization},
    author = {Hadley Wickham and Dana Seidel},
    year = {2020},
    note = {R package version 1.1.1},
    url = {https://CRAN.R-project.org/package=scales},
  }


[[57]]

To cite package ‘ragg’ in publications use:

  Thomas Lin Pedersen and Maxim Shemanarev (2021). ragg: Graphic Devices Based on AGG. R package
  version 1.1.3. https://CRAN.R-project.org/package=ragg

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {ragg: Graphic Devices Based on AGG},
    author = {Thomas Lin Pedersen and Maxim Shemanarev},
    year = {2021},
    note = {R package version 1.1.3},
    url = {https://CRAN.R-project.org/package=ragg},
  }


[[58]]

To cite package ‘proj4’ in publications use:

  Simon Urbanek (2021). proj4: A simple interface to the PROJ.4 cartographic projections library.
  R package version 1.0-10.1. https://CRAN.R-project.org/package=proj4

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {proj4: A simple interface to the PROJ.4 cartographic projections
library},
    author = {Simon Urbanek},
    year = {2021},
    note = {R package version 1.0-10.1},
    url = {https://CRAN.R-project.org/package=proj4},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[59]]

To cite package ‘lambda.r’ in publications use:

  Brian Lee Yung Rowe (2019). lambda.r: Modeling Data with Functional Programming. R package
  version 1.2.4. https://CRAN.R-project.org/package=lambda.r

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {lambda.r: Modeling Data with Functional Programming},
    author = {Brian Lee Yung Rowe},
    year = {2019},
    note = {R package version 1.2.4},
    url = {https://CRAN.R-project.org/package=lambda.r},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[60]]

To cite package ‘curl’ in publications use:

  Jeroen Ooms (2021). curl: A Modern and Flexible Web Client for R. R package version 4.3.2.
  https://CRAN.R-project.org/package=curl

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {curl: A Modern and Flexible Web Client for R},
    author = {Jeroen Ooms},
    year = {2021},
    note = {R package version 4.3.2},
    url = {https://CRAN.R-project.org/package=curl},
  }


[[61]]

To cite package ‘memoise’ in publications use:

  Hadley Wickham, Jim Hester, Winston Chang, Kirill Müller and Daniel Cook (2021). memoise:
  Memoisation of Functions. R package version 2.0.0. https://CRAN.R-project.org/package=memoise

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {memoise: Memoisation of Functions},
    author = {Hadley Wickham and Jim Hester and Winston Chang and Kirill Müller and Daniel Cook},
    year = {2021},
    note = {R package version 2.0.0},
    url = {https://CRAN.R-project.org/package=memoise},
  }


[[62]]

To cite package ‘ggrastr’ in publications use:

  Viktor Petukhov, Teun van den Brand and Evan Biederstedt (2021). ggrastr: Rasterize Layers for
  'ggplot2'. R package version 0.2.3. https://CRAN.R-project.org/package=ggrastr

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {ggrastr: Rasterize Layers for 'ggplot2'},
    author = {Viktor Petukhov and Teun {van den Brand} and Evan Biederstedt},
    year = {2021},
    note = {R package version 0.2.3},
    url = {https://CRAN.R-project.org/package=ggrastr},
  }


[[63]]

To cite package ‘RSQLite’ in publications use:

  Kirill Müller, Hadley Wickham, David A. James and Seth Falcon (2021). RSQLite: 'SQLite'
  Interface for R. R package version 2.2.7. https://CRAN.R-project.org/package=RSQLite

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {RSQLite: 'SQLite' Interface for R},
    author = {Kirill Müller and Hadley Wickham and David A. James and Seth Falcon},
    year = {2021},
    note = {R package version 2.2.7},
    url = {https://CRAN.R-project.org/package=RSQLite},
  }


[[64]]

To cite SQUAREM in publications use:

Du Y, Varadhan R (2020). “SQUAREM: An R Package for Off-the-Shelf Acceleration of EM, MM and Other
EM-Like Monotone Algorithms.” _Journal of Statistical Software_, *92*(7), 1-41. doi:
10.18637/jss.v092.i07 (URL: https://doi.org/10.18637/jss.v092.i07).

A BibTeX entry for LaTeX users is

  @Article{,
    title = {{SQUAREM}: An {R} Package for Off-the-Shelf Acceleration of {EM}, {MM} and Other {EM}-Like Monotone Algorithms},
    author = {Yu Du and Ravi Varadhan},
    journal = {Journal of Statistical Software},
    year = {2020},
    volume = {92},
    number = {7},
    pages = {1--41},
    doi = {10.18637/jss.v092.i07},
  }


[[65]]

To cite package ‘genefilter’ in publications use:

  R. Gentleman, V. Carey, W. Huber and F. Hahne (2021). genefilter: genefilter: methods for
  filtering genes from high-throughput experiments. R package version 1.72.1.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {genefilter: genefilter: methods for filtering genes from high-throughput
experiments},
    author = {R. Gentleman and V. Carey and W. Huber and F. Hahne},
    year = {2021},
    note = {R package version 1.72.1},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[66]]

To cite package ‘caTools’ in publications use:

  Jarek Tuszynski (2021). caTools: Tools: Moving Window Statistics, GIF, Base64, ROC AUC, etc. R
  package version 1.18.2. https://CRAN.R-project.org/package=caTools

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {caTools: Tools: Moving Window Statistics, GIF, Base64, ROC AUC, etc},
    author = {Jarek Tuszynski},
    year = {2021},
    note = {R package version 1.18.2},
    url = {https://CRAN.R-project.org/package=caTools},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[67]]

To cite package ‘BiocParallel’ in publications use:

  Martin Morgan, Valerie Obenchain, Michel Lang, Ryan Thompson and Nitesh Turaga (2020).
  BiocParallel: Bioconductor facilities for parallel evaluation. R package version 1.24.1.
  https://github.com/Bioconductor/BiocParallel

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {BiocParallel: Bioconductor facilities for parallel evaluation},
    author = {Martin Morgan and Valerie Obenchain and Michel Lang and Ryan Thompson and Nitesh Turaga},
    year = {2020},
    note = {R package version 1.24.1},
    url = {https://github.com/Bioconductor/BiocParallel},
  }


[[68]]

To cite package ‘truncnorm’ in publications use:

  Olaf Mersmann, Heike Trautmann, Detlef Steuer and Björn Bornkamp (2018). truncnorm: Truncated
  Normal Distribution. R package version 1.0-8. https://CRAN.R-project.org/package=truncnorm

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {truncnorm: Truncated Normal Distribution},
    author = {Olaf Mersmann and Heike Trautmann and Detlef Steuer and Björn Bornkamp},
    year = {2018},
    note = {R package version 1.0-8},
    url = {https://CRAN.R-project.org/package=truncnorm},
  }


[[69]]

To cite package ‘rlang’ in publications use:

  Lionel Henry and Hadley Wickham (2021). rlang: Functions for Base Types and Core R and
  'Tidyverse' Features. R package version 0.4.11. https://CRAN.R-project.org/package=rlang

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {rlang: Functions for Base Types and Core R and 'Tidyverse' Features},
    author = {Lionel Henry and Hadley Wickham},
    year = {2021},
    note = {R package version 0.4.11},
    url = {https://CRAN.R-project.org/package=rlang},
  }


[[70]]

To cite package ‘pkgconfig’ in publications use:

  Gábor Csárdi (2019). pkgconfig: Private Configuration for 'R' Packages. R package version 2.0.3.
  https://CRAN.R-project.org/package=pkgconfig

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {pkgconfig: Private Configuration for 'R' Packages},
    author = {Gábor Csárdi},
    year = {2019},
    note = {R package version 2.0.3},
    url = {https://CRAN.R-project.org/package=pkgconfig},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[71]]

To cite package ‘systemfonts’ in publications use:

  Thomas Lin Pedersen, Jeroen Ooms and Devon Govett (2021). systemfonts: System Native Font
  Finding. R package version 1.0.2. https://CRAN.R-project.org/package=systemfonts

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {systemfonts: System Native Font Finding},
    author = {Thomas Lin Pedersen and Jeroen Ooms and Devon Govett},
    year = {2021},
    note = {R package version 1.0.2},
    url = {https://CRAN.R-project.org/package=systemfonts},
  }


[[72]]

To cite package ‘bitops’ in publications use:

  S original by Steve Dutky initial R port, extensions by Martin Maechler; revised and modified by
  Steve Dutky (2021). bitops: Bitwise Operations. R package version 1.0-7.
  https://CRAN.R-project.org/package=bitops

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {bitops: Bitwise Operations},
    author = {S original by Steve Dutky initial R port and extensions by Martin Maechler; revised and modified by Steve Dutky},
    year = {2021},
    note = {R package version 1.0-7},
    url = {https://CRAN.R-project.org/package=bitops},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[73]]

To cite package ‘evaluate’ in publications use:

  Hadley Wickham and Yihui Xie (2019). evaluate: Parsing and Evaluation Tools that Provide More
  Details than the Default. R package version 0.14. https://CRAN.R-project.org/package=evaluate

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {evaluate: Parsing and Evaluation Tools that Provide More Details than the
Default},
    author = {Hadley Wickham and Yihui Xie},
    year = {2019},
    note = {R package version 0.14},
    url = {https://CRAN.R-project.org/package=evaluate},
  }


[[74]]

To cite the lattice package in publications use:

  Sarkar, Deepayan (2008) Lattice: Multivariate Data Visualization with R. Springer, New York.
  ISBN 978-0-387-75968-5

A BibTeX entry for LaTeX users is

  @Book{,
    title = {Lattice: Multivariate Data Visualization with R},
    author = {Deepayan Sarkar},
    publisher = {Springer},
    address = {New York},
    year = {2008},
    note = {ISBN 978-0-387-75968-5},
    url = {http://lmdvr.r-forge.r-project.org},
  }


[[75]]

To cite package ‘invgamma’ in publications use:

  David Kahle and James Stamey (2017). invgamma: The Inverse Gamma Distribution. R package version
  1.1. https://CRAN.R-project.org/package=invgamma

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {invgamma: The Inverse Gamma Distribution},
    author = {David Kahle and James Stamey},
    year = {2017},
    note = {R package version 1.1},
    url = {https://CRAN.R-project.org/package=invgamma},
  }


[[76]]

To cite package ‘lpsymphony’ in publications use:

  Vladislav Kim (2020). lpsymphony: Symphony integer linear programming solver in R.
  http://R-Forge.R-project.org/projects/rsymphony, https://projects.coin-or.org/SYMPHONY,
  http://www.coin-or.org/download/source/SYMPHONY/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {lpsymphony: Symphony integer linear programming solver in R},
    author = {Vladislav Kim},
    year = {2020},
    note = {http://R-Forge.R-project.org/projects/rsymphony,
https://projects.coin-or.org/SYMPHONY,
http://www.coin-or.org/download/source/SYMPHONY/},
  }


[[77]]

To cite package ‘purrr’ in publications use:

  Lionel Henry and Hadley Wickham (2020). purrr: Functional Programming Tools. R package version
  0.3.4. https://CRAN.R-project.org/package=purrr

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {purrr: Functional Programming Tools},
    author = {Lionel Henry and Hadley Wickham},
    year = {2020},
    note = {R package version 0.3.4},
    url = {https://CRAN.R-project.org/package=purrr},
  }


[[78]]

To cite package ‘htmlwidgets’ in publications use:

  Ramnath Vaidyanathan, Yihui Xie, JJ Allaire, Joe Cheng, Carson Sievert and Kenton Russell
  (2020). htmlwidgets: HTML Widgets for R. R package version 1.5.3.
  https://CRAN.R-project.org/package=htmlwidgets

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {htmlwidgets: HTML Widgets for R},
    author = {Ramnath Vaidyanathan and Yihui Xie and JJ Allaire and Joe Cheng and Carson Sievert and Kenton Russell},
    year = {2020},
    note = {R package version 1.5.3},
    url = {https://CRAN.R-project.org/package=htmlwidgets},
  }


[[79]]

To cite package ‘labeling’ in publications use:

  Justin Talbot, (2020). labeling: Axis Labeling. R package version 0.4.2.
  https://CRAN.R-project.org/package=labeling

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {labeling: Axis Labeling},
    author = {Justin Talbot,},
    year = {2020},
    note = {R package version 0.4.2},
    url = {https://CRAN.R-project.org/package=labeling},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[80]]

To cite package ‘bit’ in publications use:

  Jens Oehlschlägel and Brian Ripley (2020). bit: Classes and Methods for Fast Memory-Efficient
  Boolean Selections. R package version 4.0.4. https://CRAN.R-project.org/package=bit

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {bit: Classes and Methods for Fast Memory-Efficient Boolean Selections},
    author = {Jens Oehlschlägel and Brian Ripley},
    year = {2020},
    note = {R package version 4.0.4},
    url = {https://CRAN.R-project.org/package=bit},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[81]]

To cite package ‘tidyselect’ in publications use:

  Lionel Henry and Hadley Wickham (2021). tidyselect: Select from a Set of Strings. R package
  version 1.1.1. https://CRAN.R-project.org/package=tidyselect

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {tidyselect: Select from a Set of Strings},
    author = {Lionel Henry and Hadley Wickham},
    year = {2021},
    note = {R package version 1.1.1},
    url = {https://CRAN.R-project.org/package=tidyselect},
  }


[[82]]

To cite package ‘magrittr’ in publications use:

  Stefan Milton Bache and Hadley Wickham (2020). magrittr: A Forward-Pipe Operator for R. R
  package version 2.0.1. https://CRAN.R-project.org/package=magrittr

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {magrittr: A Forward-Pipe Operator for R},
    author = {Stefan Milton Bache and Hadley Wickham},
    year = {2020},
    note = {R package version 2.0.1},
    url = {https://CRAN.R-project.org/package=magrittr},
  }


[[83]]

To cite package ‘R6’ in publications use:

  Winston Chang (2020). R6: Encapsulated Classes with Reference Semantics. R package version
  2.5.0. https://CRAN.R-project.org/package=R6

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R6: Encapsulated Classes with Reference Semantics},
    author = {Winston Chang},
    year = {2020},
    note = {R package version 2.5.0},
    url = {https://CRAN.R-project.org/package=R6},
  }


[[84]]

To cite package ‘generics’ in publications use:

  Hadley Wickham, Max Kuhn and Davis Vaughan (2020). generics: Common S3 Generics not Provided by
  Base R Methods Related to Model Fitting. R package version 0.1.0.
  https://CRAN.R-project.org/package=generics

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {generics: Common S3 Generics not Provided by Base R Methods Related to
Model Fitting},
    author = {Hadley Wickham and Max Kuhn and Davis Vaughan},
    year = {2020},
    note = {R package version 0.1.0},
    url = {https://CRAN.R-project.org/package=generics},
  }


[[85]]

To cite package ‘DelayedArray’ in publications use:

  Hervé Pagès, with contributions from Peter Hickey and Aaron Lun (2021). DelayedArray: A unified
  framework for working transparently with on-disk and in-memory array-like datasets. R package
  version 0.16.3. https://bioconductor.org/packages/DelayedArray

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {DelayedArray: A unified framework for working transparently with on-disk and
in-memory array-like datasets},
    author = {Hervé Pagès and with contributions from Peter Hickey and Aaron Lun},
    year = {2021},
    note = {R package version 0.16.3},
    url = {https://bioconductor.org/packages/DelayedArray},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[86]]

To cite package ‘DBI’ in publications use:

  R Special Interest Group on Databases (R-SIG-DB), Hadley Wickham and Kirill Müller (2021). DBI:
  R Database Interface. R package version 1.1.1. https://CRAN.R-project.org/package=DBI

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {DBI: R Database Interface},
    author = {{R Special Interest Group on Databases (R-SIG-DB)} and Hadley Wickham and Kirill Müller},
    year = {2021},
    note = {R package version 1.1.1},
    url = {https://CRAN.R-project.org/package=DBI},
  }


[[87]]

To cite package ‘pillar’ in publications use:

  Kirill Müller and Hadley Wickham (2021). pillar: Coloured Formatting for Columns. R package
  version 1.6.2. https://CRAN.R-project.org/package=pillar

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {pillar: Coloured Formatting for Columns},
    author = {Kirill Müller and Hadley Wickham},
    year = {2021},
    note = {R package version 1.6.2},
    url = {https://CRAN.R-project.org/package=pillar},
  }


[[88]]

To cite package ‘withr’ in publications use:

  Jim Hester, Kirill Müller, Kevin Ushey, Hadley Wickham and Winston Chang (2021). withr: Run Code
  'With' Temporarily Modified Global State. R package version 2.4.2.
  https://CRAN.R-project.org/package=withr

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {withr: Run Code 'With' Temporarily Modified Global State},
    author = {Jim Hester and Kirill Müller and Kevin Ushey and Hadley Wickham and Winston Chang},
    year = {2021},
    note = {R package version 2.4.2},
    url = {https://CRAN.R-project.org/package=withr},
  }


[[89]]

Therneau T (2021). _A Package for Survival Analysis in R_. R package version 3.2-10, <URL:
https://CRAN.R-project.org/package=survival>.

Terry M. Therneau, Patricia M. Grambsch (2000). _Modeling Survival Data: Extending the Cox Model_.
Springer, New York. ISBN 0-387-98784-3.

To see these entries in BibTeX format, use 'print(<citation>, bibtex=TRUE)', 'toBibtex(.)', or set
'options(citation.bibtex.max=999)'.


[[90]]

To cite scatterplot3d in publications use:

  Ligges, U. and Mächler, M. (2003). Scatterplot3d - an R Package for Visualizing Multivariate
  Data. Journal of Statistical Software 8(11), 1-20.

A BibTeX entry for LaTeX users is

  @Article{,
    title = {Scatterplot3d - an R Package for Visualizing Multivariate Data},
    author = {Uwe Ligges and Martin M{\"a}chler},
    journal = {Journal of Statistical Software},
    year = {2003},
    pages = {1--20},
    number = {11},
    volume = {8},
    url = {http://www.jstatsoft.org},
  }


[[91]]

To cite package ‘RCurl’ in publications use:

  Duncan Temple Lang (2021). RCurl: General Network (HTTP/FTP/...) Client Interface for R. R
  package version 1.98-1.3. https://CRAN.R-project.org/package=RCurl

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {RCurl: General Network (HTTP/FTP/...) Client Interface for R},
    author = {Duncan {Temple Lang}},
    year = {2021},
    note = {R package version 1.98-1.3},
    url = {https://CRAN.R-project.org/package=RCurl},
  }


[[92]]

To cite the mixsqp package, please use:

  Youngseok Kim, Peter Carbonetto, Matthew Stephens and Mihai Anitescu (2020). A fast algorithm
  for maximum likelihood estimation of mixture proportions using sequential quadratic programming.
  To appear in the Journal of Computational and Graphical Statistics,
  doi:10.1080/10618600.2019.1689985

A BibTeX entry for LaTeX users is

  @Article{,
    title = {A fast algorithm for maximum likelihood estimation of mixture proportions using sequential quadratic programming},
    author = {Youngseok Kim and Peter Carbonetto and Matthew Stephens and Mihai Anitescu},
    journal = {Journal of Computational and Graphical Statistics},
    year = {2020},
    url = {https://doi.org/10.1080/10618600.2019.1689985},
  }


[[93]]

To cite package ‘ash’ in publications use:

  S original by David W. Scott R port by Albrecht Gebhardt adopted to recent S-PLUS by Stephen
  Kaluzny <spk@insightful.com> (2015). ash: David Scott's ASH Routines. R package version 1.0-15.
  https://CRAN.R-project.org/package=ash

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {ash: David Scott's ASH Routines},
    author = {S original by David W. Scott R port by Albrecht Gebhardt adopted to recent S-PLUS by Stephen Kaluzny <spk@insightful.com>},
    year = {2015},
    note = {R package version 1.0-15},
    url = {https://CRAN.R-project.org/package=ash},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[94]]

To cite package ‘crayon’ in publications use:

  Gábor Csárdi (2021). crayon: Colored Terminal Output. R package version 1.4.1.
  https://CRAN.R-project.org/package=crayon

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {crayon: Colored Terminal Output},
    author = {Gábor Csárdi},
    year = {2021},
    note = {R package version 1.4.1},
    url = {https://CRAN.R-project.org/package=crayon},
  }


[[95]]

To cite package ‘futile.options’ in publications use:

  Brian Lee Yung Rowe (2018). futile.options: Futile Options Management. R package version 1.0.1.
  https://CRAN.R-project.org/package=futile.options

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {futile.options: Futile Options Management},
    author = {Brian Lee Yung Rowe},
    year = {2018},
    note = {R package version 1.0.1},
    url = {https://CRAN.R-project.org/package=futile.options},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[96]]

To cite package ‘fdrtool’ in publications use:

  Bernd Klaus and Korbinian Strimmer. (2021). fdrtool: Estimation of (Local) False Discovery Rates
  and Higher Criticism. R package version 1.2.16. https://CRAN.R-project.org/package=fdrtool

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {fdrtool: Estimation of (Local) False Discovery Rates and Higher Criticism},
    author = {Bernd Klaus and Korbinian Strimmer.},
    year = {2021},
    note = {R package version 1.2.16},
    url = {https://CRAN.R-project.org/package=fdrtool},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[97]]

To cite package ‘KernSmooth’ in publications use:

  Matt Wand (2020). KernSmooth: Functions for Kernel Smoothing Supporting Wand & Jones (1995). R
  package version 2.23-18. https://CRAN.R-project.org/package=KernSmooth

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {KernSmooth: Functions for Kernel Smoothing Supporting Wand & Jones (1995)},
    author = {Matt Wand},
    year = {2020},
    note = {R package version 2.23-18},
    url = {https://CRAN.R-project.org/package=KernSmooth},
  }


[[98]]

To cite package ‘utf8’ in publications use:

  Patrick O. Perry (2021). utf8: Unicode Text Processing. R package version 1.2.1.
  https://CRAN.R-project.org/package=utf8

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {utf8: Unicode Text Processing},
    author = {Patrick O. Perry},
    year = {2021},
    note = {R package version 1.2.1},
    url = {https://CRAN.R-project.org/package=utf8},
  }


[[99]]

To cite the 'rmarkdown' package in publications, please use:

  JJ Allaire and Yihui Xie and Jonathan McPherson and Javier Luraschi and Kevin Ushey and Aron
  Atkins and Hadley Wickham and Joe Cheng and Winston Chang and Richard Iannone (2021). rmarkdown:
  Dynamic Documents for R. R package version 2.9. URL https://rmarkdown.rstudio.com.

  Yihui Xie and J.J. Allaire and Garrett Grolemund (2018). R Markdown: The Definitive Guide.
  Chapman and Hall/CRC. ISBN 9781138359338. URL https://bookdown.org/yihui/rmarkdown.

  Yihui Xie and Christophe Dervieux and Emily Riederer (2020). R Markdown Cookbook. Chapman and
  Hall/CRC. ISBN 9780367563837. URL https://bookdown.org/yihui/rmarkdown-cookbook.

To see these entries in BibTeX format, use 'print(<citation>, bibtex=TRUE)', 'toBibtex(.)', or set
'options(citation.bibtex.max=999)'.


[[100]]

To cite package ‘locfit’ in publications use:

  Catherine Loader (2020). locfit: Local Regression, Likelihood and Density Estimation. R package
  version 1.5-9.4. https://CRAN.R-project.org/package=locfit

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {locfit: Local Regression, Likelihood and Density Estimation},
    author = {Catherine Loader},
    year = {2020},
    note = {R package version 1.5-9.4},
    url = {https://CRAN.R-project.org/package=locfit},
  }


[[101]]

To cite package ‘blob’ in publications use:

  Hadley Wickham (2021). blob: A Simple S3 Class for Representing Vectors of Binary Data
  ('BLOBS'). R package version 1.2.2. https://CRAN.R-project.org/package=blob

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {blob: A Simple S3 Class for Representing Vectors of Binary Data
('BLOBS')},
    author = {Hadley Wickham},
    year = {2021},
    note = {R package version 1.2.2},
    url = {https://CRAN.R-project.org/package=blob},
  }


[[102]]

To cite package ‘digest’ in publications use:

  Dirk Eddelbuettel with contributions by Antoine Lucas, Jarek Tuszynski, Henrik Bengtsson, Simon
  Urbanek, Mario Frasca, Bryan Lewis, Murray Stokely, Hannes Muehleisen, Duncan Murdoch, Jim
  Hester, Wush Wu, Qiang Kou, Thierry Onkelinx, Michel Lang, Viliam Simko, Kurt Hornik, Radford
  Neal, Kendon Bell, Matthew de Queljoe, Ion Suruceanu, Bill Denney, Dirk Schumacher and and
  Winston Chang. (2020). digest: Create Compact Hash Digests of R Objects. R package version
  0.6.27. https://CRAN.R-project.org/package=digest

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {digest: Create Compact Hash Digests of R Objects},
    author = {Dirk Eddelbuettel with contributions by Antoine Lucas and Jarek Tuszynski and Henrik Bengtsson and Simon Urbanek and Mario Frasca and Bryan Lewis and Murray Stokely and Hannes Muehleisen and Duncan Murdoch and Jim Hester and Wush Wu and Qiang Kou and Thierry Onkelinx and Michel Lang and Viliam Simko and Kurt Hornik and Radford Neal and Kendon Bell and Matthew {de Queljoe} and Ion Suruceanu and Bill Denney and Dirk Schumacher and and Winston Chang.},
    year = {2020},
    note = {R package version 0.6.27},
    url = {https://CRAN.R-project.org/package=digest},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[103]]

To cite flashClust in publications use:

  Peter Langfelder, Steve Horvath (2012). Fast R Functions for Robust Correlations and
  Hierarchical Clustering. Journal of Statistical Software, 46(11), 1-17. URL
  http://www.jstatsoft.org/v46/i11/.

A BibTeX entry for LaTeX users is

  @Article{,
    title = {Fast {R} Functions for Robust Correlations and Hierarchical Clustering},
    author = {Peter Langfelder and Steve Horvath},
    journal = {Journal of Statistical Software},
    year = {2012},
    volume = {46},
    number = {11},
    pages = {1--17},
    url = {http://www.jstatsoft.org/v46/i11/},
  }


[[104]]

To cite package ‘xtable’ in publications use:

  David B. Dahl, David Scott, Charles Roosen, Arni Magnusson and Jonathan Swinton (2019). xtable:
  Export Tables to LaTeX or HTML. R package version 1.8-4.
  https://CRAN.R-project.org/package=xtable

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {xtable: Export Tables to LaTeX or HTML},
    author = {David B. Dahl and David Scott and Charles Roosen and Arni Magnusson and Jonathan Swinton},
    year = {2019},
    note = {R package version 1.8-4},
    url = {https://CRAN.R-project.org/package=xtable},
  }


[[105]]

To cite package ‘textshaping’ in publications use:

  Thomas Lin Pedersen (2021). textshaping: Bindings to the 'HarfBuzz' and 'Fribidi' Libraries for
  Text Shaping. R package version 0.3.5. https://CRAN.R-project.org/package=textshaping

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {textshaping: Bindings to the 'HarfBuzz' and 'Fribidi' Libraries for Text
Shaping},
    author = {Thomas Lin Pedersen},
    year = {2021},
    note = {R package version 0.3.5},
    url = {https://CRAN.R-project.org/package=textshaping},
  }


[[106]]

To cite package ‘munsell’ in publications use:

  Charlotte Wickham (2018). munsell: Utilities for Using Munsell Colours. R package version 0.5.0.
  https://CRAN.R-project.org/package=munsell

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {munsell: Utilities for Using Munsell Colours},
    author = {Charlotte Wickham},
    year = {2018},
    note = {R package version 0.5.0},
    url = {https://CRAN.R-project.org/package=munsell},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.


[[107]]

To cite package ‘beeswarm’ in publications use:

  Aron Eklund and James Trimble (2021). beeswarm: The Bee Swarm Plot, an Alternative to
  Stripchart. R package version 0.4.0. https://CRAN.R-project.org/package=beeswarm

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {beeswarm: The Bee Swarm Plot, an Alternative to Stripchart},
    author = {Aron Eklund and James Trimble},
    year = {2021},
    note = {R package version 0.4.0},
    url = {https://CRAN.R-project.org/package=beeswarm},
  }


[[108]]

To cite package ‘vipor’ in publications use:

  Scott Sherrill-Mix and Erik Clarke (2017). vipor: Plot Categorical Data Using Quasirandom Noise
  and Density Estimates. R package version 0.4.5. https://CRAN.R-project.org/package=vipor

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {vipor: Plot Categorical Data Using Quasirandom Noise and Density
Estimates},
    author = {Scott Sherrill-Mix and Erik Clarke},
    year = {2017},
    note = {R package version 0.4.5},
    url = {https://CRAN.R-project.org/package=vipor},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and
may need manual editing, see ‘help("citation")’.
```r
#FIN

```

LS0tDQp0aXRsZTogIkRFc2VxMiBwaXBsZWluZSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQpgYGB7cn0NCiMjIFJOQS1zZXEgYW5hbHlzaXMgd2l0aCBERVNlcTINCiMjUGFydHMgb2YgdGhpcyBzY3JpcHQgYXJlIGFsc28gYmFzZWQgb2ZmIG9mIHRoZSBiaW9jb25kdWN0b3IgcGFnZToNCiMjaHR0cDovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvZGV2ZWwvYmlvYy92aWduZXR0ZXMvREVTZXEyL2luc3QvZG9jL0RFU2VxMi5odG1sDQojI2h0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL3dvcmtmbG93cy92aWduZXR0ZXMvcm5hc2VxR2VuZS9pbnN0L2RvYy9ybmFzZXFHZW5lLmh0bWwNCiMjcmVmZXJlbmNlZCAyLjMuMjANCiMjIFN0ZXBoZW4gVHVybmVyLCBAZ2VuZXRpY3NfYmxvZw0KIyNodHRwczovL2dpc3QuZ2l0aHViLmNvbS9zdGVwaGVudHVybmVyL2Y2MGMxOTM0NDA1YzEyN2YwOWE2I2ZpbGUtZGVzZXEyLWFuYWx5c2lzLXRlbXBsYXRlLXINCiMjZG93bmxvYWRlZCAyLjMuMjAyMA0KI0NvZGUgd3JpdHRlbiBieSBNaWtlIFNwb3J0aWVsbG8uIE1pY2hhZWxfc3BvcnRpZWxsb0B1cm1jLnJvY2hlc3Rlci5lZHUNCmBgYA0KDQpgYGB7cn0NCiMgSW1wb3J0IGRhdGEgZnJvbSBmZWF0dXJlQ291bnRzDQpjb3VudGRhdGEgPC0gcmVhZC50YWJsZSgicmF3Y291bnRzLnN0aW0uNS4xMy4yMC50eHQiLCBoZWFkZXI9VFJVRSwgcm93Lm5hbWVzPTEpDQoNCiMgQ29udmVydCB0byBtYXRyaXgNCmNvdW50ZGF0YSA8LSBhcy5tYXRyaXgoY291bnRkYXRhKQ0KaGVhZChjb3VudGRhdGEpDQoNCiMgQXNzaWduIGNvbmRpdGlvbnMNCihjb25kaXRpb24gPC0gZmFjdG9yKGMocmVwKCJDRDEwMyIsIDMpLCByZXAoIkRQIiwgMyksIHJlcCgiRE4iLDMpLCByZXAoIkNENDlhIiwyKSkpKQ0KI2xvYWQgbGlicmFyaWVzDQpsaWJyYXJ5KERFU2VxMikNCmxpYnJhcnkoZGVuZGV4dGVuZCkNCmBgYA0KDQoNCmBgYHtyfQ0KI2NyZWF0ZSBkZW5kcm9ncmFtIG9mIHNhbXBsZXMNCmRpc3QgPC0gZGlzdCh0KGNvdW50ZGF0YSksIG1ldGhvZD0iZXVjbGlkZWFuIikNCmNsdXN0ZXIgPC0gaGNsdXN0KGRpc3QpDQpkZW5kIDwtIGFzLmRlbmRyb2dyYW0oY2x1c3RlcikNCmRlbmQgPC0gaGFuZy5kZW5kcm9ncmFtKGRlbmQsIGhhbmc9LTEpICNMZWF2ZXMgYXQgc2FtZSBoZWlnaHQNCmRlbmQgPC0gc2V0KGRlbmQsICJicmFuY2hlc19sd2QiLCAyKSAjVGhpY2sgYnJhbmNoZXMNCmRlbmQgPC0gc2V0KGRlbmQsICJsYWJlbHNfY2V4IiwgMSkgI2xhYmVsIGZvbnQgc2l6ZQ0KI1Bsb3QgdGhlIGRlbmRyb2dyYW0NCnBhcihtYXIgPSBjKDEwLDUsMywxKSkNCnBsb3QoZGVuZCwgbWFpbiA9ICJTYW1wbGUgQ2x1c3RlcmluZyBvbiBzdGltdWxhdGVkIHNhbXBsZXNcbmRpc3QubWV0aG9kPUV1Y2xlYWRpYW4iLCB5bGFiID0gIkhlaWdodCIpIA0KYGBgDQoNCmBgYHtyfQ0KIyBDcmVhdGUgYSBjb2xkYXRhIGZyYW1lIGFuZCBpbnN0YW50aWF0ZSB0aGUgREVTZXFEYXRhU2V0LiBTZWUgP0RFU2VxRGF0YVNldEZyb21NYXRyaXgNCihjb2xkYXRhIDwtIGRhdGEuZnJhbWUocm93Lm5hbWVzPWNvbG5hbWVzKGNvdW50ZGF0YSksIGNvbmRpdGlvbikpDQpkZHMgPC0gREVTZXFEYXRhU2V0RnJvbU1hdHJpeChjb3VudERhdGE9Y291bnRkYXRhLCBjb2xEYXRhPWNvbGRhdGEsIGRlc2lnbj0gfiBjb25kaXRpb24pDQpkZHMNCmBgYA0KDQoNCmBgYHtyfQ0KIyBCZWdpbiB0aGUgREVTZXEgcGlwZWxpbmUNCmRkcyA8LSBERVNlcShkZHMpDQpyZXN1bHRzTmFtZXMoZGRzKQ0KYGBgDQoNCmBgYHtyfQ0KI0Rpc3BlcnNpb25zDQojUGxvdHRpbmcgdGhlIGRpc3BlcnNpb24gZXN0aW1hdGVzIGlzIGEgdXNlZnVsIGRpYWdub3N0aWMuIFRoZSBkaXNwZXJzaW9uIHBsb3QgYmVsb3cgaXMgdHlwaWNhbCwgd2l0aCB0aGUgZmluYWwgZXN0aW1hdGVzIHNocnVuayBmcm9tIHRoZSBnZW5lLXdpc2UgZXN0aW1hdGVzIHRvd2FyZHMgdGhlIGZpdHRlZCBlc3RpbWF0ZXMuIFNvbWUgZ2VuZS13aXNlIGVzdGltYXRlcyBhcmUgZmxhZ2dlZCBhcyBvdXRsaWVycyBhbmQgbm90IHNocnVuayB0b3dhcmRzIHRoZSBmaXR0ZWQgdmFsdWUsICh0aGlzIG91dGxpZXIgZGV0ZWN0aW9uIGlzIGRlc2NyaWJlZCBpbiB0aGUgbWFudWFsIHBhZ2UgZm9yIGVzdGltYXRlRGlzcGVyc2lvbnNNQVApLiBUaGUgYW1vdW50IG9mIHNocmlua2FnZSBjYW4gYmUgbW9yZSBvciBsZXNzIHRoYW4gc2VlbiBoZXJlLCBkZXBlbmRpbmcgb24gdGhlIHNhbXBsZSBzaXplLCB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cywgdGhlIHJvdyBtZWFuIGFuZCB0aGUgdmFyaWFiaWxpdHkgb2YgdGhlIGdlbmUtd2lzZSBlc3RpbWF0ZXMuDQojbG9hZCBjb2xvcnMgZm9yIGZ1dHVyZSBwbG90cw0KbGlicmFyeSh2aXJpZGlzKQ0KdmlyaWRpc3BhbDQ8LSB2aXJpZGlzKG49NCkNCiNwbG90IGRpc3BlcnNpb24gcGxvdHMNCnBsb3REaXNwRXN0cyhkZHMsIG1haW49IkRpc3BlcnNpb24gcGxvdCIsIGdlbmVjb2w9JyM0NDAxNTRGRicsZmluYWxjb2w9JyMyMTkwOENGRicsZml0Y29sPScjRkRFNzI1RkYnKQ0KYGBgDQoNCg0KYGBge3J9DQojIFJlZ3VsYXJpemVkIGxvZyB0cmFuc2Zvcm1hdGlvbiBmb3IgY2x1c3RlcmluZy9oZWF0bWFwcywgZXRjDQpsaWJyYXJ5KGdncGxvdDIpDQpybGQgPC0gcmxvZ1RyYW5zZm9ybWF0aW9uKGRkcykNCmhlYWQoYXNzYXkocmxkKSkNCiNwbG90IGhpc3RvZ3JhbSBvZiB0aGlzIHRyYW5zZm9ybWVkIGRhdGENCmhpc3QoYXNzYXkocmxkKSxjb2w9JyM0NDAxNTRGRicpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoIkZhY3RvTWluZVIiKQ0KbGlicmFyeSgiZmFjdG9leHRyYSIpDQoNCg0KIycgQGluY2x1ZGUgdXRpbGl0aWVzLlINCk5VTEwNCiMnIFBsb3QgY29uZmlkZW5jZSBlbGxpcHNlcy4NCiMnIEBkZXNjcmlwdGlvbiBQbG90IGNvbmZpZGVuY2UgZWxsaXBzZXMgYXJvdW5kIGJhcnljZW50ZXJzLiBUaGUgbWV0aG9kIGZvcg0KIycgICBjb21wdXRpbmcgY29uZmlkZW5jZSBlbGxpcHNlcyBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIFxjb2Rle0ZhY3RvTWluZVI6OmNvb3JkLmVsbGlwc2UoKX0uDQojJyBAaW5oZXJpdFBhcmFtcyBnZ3Bsb3QyOjpsYXllcg0KIycgQGluaGVyaXRQYXJhbXMgZ2dwbG90Mjo6c3RhdF9lbGxpcHNlDQojJyBAcGFyYW0gbGV2ZWwgY29uZmlkZW5jZSBsZXZlbCB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgZWxsaXBzZXMuIEJ5DQojJyAgIGRlZmF1bHQsIDAuOTUuDQojJyBAcGFyYW0gbnBvaW50IG51bWJlciBvZiBwb2ludHMgdXNlZCB0byBkcmF3IHRoZSBlbGxpcHNlcy4NCiMnIEBwYXJhbSBiYXJ5IGxvZ2ljYWwgdmFsdWUuIElmIFRSVUUsIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgZWxsaXBzZSBhcm91bmQgdGhlDQojJyAgIGJhcnljZW50cmUgb2YgaW5kaXZpZHVhbHMgYXJlIGNhbGN1bGF0ZWQuDQojJyBAc2VlYWxzbyBcY29kZXtcbGlua3tzdGF0X2NvbmZfZWxsaXBzZX19DQojJyBAZXhhbXBsZXMNCiMnICMgTG9hZCBkYXRhDQojJyBkYXRhKCJtdGNhcnMiKQ0KIycgZGYgPC0gbXRjYXJzDQojJyBkZiRjeWwgPC0gYXMuZmFjdG9yKGRmJGN5bCkNCiMnDQojJyAjIHNjYXR0ZXIgcGxvdCB3aXRoIGNvbmZpZGVuY2UgZWxsaXBzZXMNCiMnIGdnc2NhdHRlcihkZiwgeCA9ICJ3dCIsIHkgPSAibXBnIiwgY29sb3IgPSAiY3lsIikrDQojJyAgc3RhdF9jb25mX2VsbGlwc2UoYWVzKGNvbG9yID0gY3lsKSkNCiMnDQojJyBnZ3NjYXR0ZXIoZGYsIHggPSAid3QiLCB5ID0gIm1wZyIsIGNvbG9yID0gImN5bCIpKw0KIycgIHN0YXRfY29uZl9lbGxpcHNlKGFlcyhjb2xvciA9IGN5bCwgZmlsbCA9IGN5bCksIGFscGhhID0gMC4xLCBnZW9tID0gInBvbHlnb24iKQ0KIycNCiMnIEBleHBvcnQNCnN0YXRfY29uZl9lbGxpcHNlIDwtIGZ1bmN0aW9uKG1hcHBpbmcgPSBOVUxMLCBkYXRhID0gTlVMTCwgZ2VvbSA9ICJwYXRoIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gImlkZW50aXR5IiwgbmEucm0gPSBGQUxTRSwgc2hvdy5sZWdlbmQgPSBOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gVFJVRSwgbGV2ZWwgPSAwLjk1LCBucG9pbnQgPSAxMDAsIGJhcnkgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKSB7DQogIGxheWVyKA0KICAgIHN0YXQgPSBTdGF0Q29uZkVsbGlwc2UsIGRhdGEgPSBkYXRhLCBtYXBwaW5nID0gbWFwcGluZywgZ2VvbSA9IGdlb20sDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbiwgc2hvdy5sZWdlbmQgPSBzaG93LmxlZ2VuZCwgaW5oZXJpdC5hZXMgPSBpbmhlcml0LmFlcywNCiAgICBwYXJhbXMgPSBsaXN0KG5hLnJtID0gbmEucm0sICBsZXZlbCA9IGxldmVsLCBucG9pbnQgPSBucG9pbnQsIGJhcnkgPSBiYXJ5LCAuLi4pDQogICkNCn0NCg0KDQpTdGF0Q29uZkVsbGlwc2UgPC0gZ2dwcm90bygiU3RhdENvbmZFbGxpcHNlIiwgU3RhdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkX2FlcyA9IGMoIngiLCAieSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlX2dyb3VwID0gZnVuY3Rpb24oZGF0YSwgc2NhbGVzLCBwYXJhbXMsIGxldmVsID0gMC45NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucG9pbnQgPSAxMDAsIGJhcnkgPSBUUlVFKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29vcmRfZWxsaXBzZSAoZGF0YSR4LCBkYXRhJHksIGxldmVsID0gbGV2ZWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucG9pbnQgPSBucG9pbnQsIGJhcnkgPSBiYXJ5KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKQ0KDQojIENvbXB1dGUgY29uZmlkZW5jZSBlbGxpcHNlcy4NCiMgIHgseSB4IGFuZCB5IHZhcmlhYmxlcyBmb3IgZHJhd2luZy4NCiMgIGxldmVsIGNvbmZpZGVuY2UgbGV2ZWwgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGVsbGlwc2VzLiBCeQ0KIyAgIGRlZmF1bHQsIDAuOTUuDQojICBucG9pbnQgbnVtYmVyIG9mIHBvaW50cyB1c2VkIHRvIGRyYXcgdGhlIGVsbGlwc2VzLg0KIyAgYmFyeSBsb2dpY2FsIHZhbHVlLiBJZiBUUlVFLCB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGVsbGlwc2UgYXJvdW5kIHRoZQ0KIyAgIGJhcnljZW50cmUgb2YgaW5kaXZpZHVhbHMgYXJlIGNhbGN1bGF0ZWQuDQouY29vcmRfZWxsaXBzZSA8LSBmdW5jdGlvbiAoIHgsIHksIGxldmVsID0gMC45NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnBvaW50ID0gMTAwLCBiYXJ5ID0gRkFMU0UpDQp7DQogIA0KICAuZWxsaXBzZSA8LSBmdW5jdGlvbih4LCBzY2FsZSA9IGMoMSwgMSksIGNlbnRyZSA9IGMoMCwgMCksDQogICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gMC45NSwgdCA9IHNxcnQoc3RhdHM6OnFjaGlzcShsZXZlbCwgMikpLCB3aGljaCA9IGMoMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSwgbnBvaW50cyA9IDEwMCkgew0KICAgIG5hbWVzIDwtIGMoIngiLCAieSIpDQogICAgaWYgKGlzLm1hdHJpeCh4KSkgew0KICAgICAgeGluZCA8LSB3aGljaFsxXQ0KICAgICAgeWluZCA8LSB3aGljaFsyXQ0KICAgICAgciA8LSB4W3hpbmQsIHlpbmRdDQogICAgICBpZiAobWlzc2luZyhzY2FsZSkpIHsNCiAgICAgICAgc2NhbGUgPC0gc3FydChjKHhbeGluZCwgeGluZF0sIHhbeWluZCwgeWluZF0pKQ0KICAgICAgICBpZiAoc2NhbGVbMV0gPiAwKQ0KICAgICAgICAgIHIgPC0gci9zY2FsZVsxXQ0KICAgICAgICBpZiAoc2NhbGVbMl0gPiAwKQ0KICAgICAgICAgIHIgPC0gci9zY2FsZVsyXQ0KICAgICAgfQ0KICAgICAgaWYgKCFpcy5udWxsKGRpbW5hbWVzKHgpW1sxXV0pKQ0KICAgICAgICBuYW1lcyA8LSBkaW1uYW1lcyh4KVtbMV1dW2MoeGluZCwgeWluZCldDQogICAgfQ0KICAgIGVsc2UgciA8LSB4DQogICAgciA8LSBtaW4obWF4KHIsIC0xKSwgMSkNCiAgICBkIDwtIGFjb3MocikNCiAgICBhIDwtIHNlcSgwLCAyICogcGksIGxlbiA9IG5wb2ludHMpDQogICAgbWF0cml4KGModCAqIHNjYWxlWzFdICogY29zKGEgKyBkLzIpICsgY2VudHJlWzFdLCB0ICoNCiAgICAgICAgICAgICAgIHNjYWxlWzJdICogY29zKGEgLSBkLzIpICsgY2VudHJlWzJdKSwgbnBvaW50cywgMiwNCiAgICAgICAgICAgZGltbmFtZXMgPSBsaXN0KE5VTEwsIG5hbWVzKSkNCiAgfQ0KICANCiAgDQogIGNlbnRlciA8LSBjKG1lYW4oeCwgbmEucm0gPSBUUlVFKSwgbWVhbih5LCBuYS5ybSA9IFRSVUUpKQ0KICB0YWIgPC0gZGF0YS5mcmFtZSh4ID0geCwgeSA9IHkpDQogIG1hdC5jb3YgPC0gc3RhdHM6OmNvdih0YWIpDQogIGlmIChiYXJ5KQ0KICAgIG1hdC5jb3YgPSBtYXQuY292L25yb3codGFiKQ0KICByZXMgPC0gLmVsbGlwc2UobWF0LmNvdiwgY2VudHJlID0gY2VudGVyLCBsZXZlbCA9IGxldmVsLCBucG9pbnRzID0gbnBvaW50KQ0KICByZXR1cm4ocmVzKQ0KfQ0KYGBgDQoNCg0KYGBge3J9DQojcGxvdCBQQ0FzIHdpdGggY29uZmlkZW5jZSBpbnRlcnZhbHMNCmNicGFsPC1jKCIjYWNmYWZhIiwnIzQxNDE0MScsIiNmMjk3MzciLCIjODc0NGY2IikNCnBjYTwtcGxvdFBDQShybGQpDQpwY2Erc2NhbGVfY29sb3VyX3ZpcmlkaXMoZGlzY3JldGU9VCkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY2JwYWwpICtzdGF0X2NvbmZfZWxsaXBzZSgpICt0aGVtZV9idygpDQpgYGANCg0KDQpgYGB7cn0NCiNwbG90IHBjYSBsb2FkaW5ncw0KcnYgPC0gcm93VmFycyhhc3NheShybGQpKQ0Kc2VsZWN0IDwtIG9yZGVyKHJ2LCBkZWNyZWFzaW5nPVRSVUUpW3NlcV9sZW4obWluKDUwMCxsZW5ndGgocnYpKSldDQpzdWJzZXQgPC0gYXNzYXkocmxkKVtzZWxlY3QsIF0NCnBjYSA8LSBwcmNvbXAodChzdWJzZXQpKQ0KDQoNCmxvYWRpbmdzIDwtIGFzLmRhdGEuZnJhbWUocGNhJHJvdGF0aW9uKQ0KbG9hZGluZ3MkZ2VuZXM8LXJvdy5uYW1lcyhsb2FkaW5ncykNCmxvYWRpbmdzIDwtIGFzLmRhdGEuZnJhbWUocGNhJHJvdGF0aW9uKQ0KbG9hZGluZ3MkZ2VuZXM8LXJvdy5uYW1lcyhsb2FkaW5ncykNCg0KbG9hZGluZ3M8LWxvYWRpbmdzW29yZGVyKC1sb2FkaW5ncyRQQzEpLF0NCmhlYWQobG9hZGluZ3MpDQpwcmluYzE8LWxvYWRpbmdzWzE6MTAsXQ0KbG9hZGluZ3M8LWxvYWRpbmdzW29yZGVyKGxvYWRpbmdzJFBDMSksXQ0KcHJpbmMxYjwtbG9hZGluZ3NbMToxMCxdDQpoZWFkKHByaW5jMSkNCmhlYWQocHJpbmMxYikNCnByaW5jMTwtcmJpbmQocHJpbmMxLHByaW5jMWIpDQoNCmxvYWRpbmdzPC1sb2FkaW5nc1tvcmRlcigtbG9hZGluZ3MkUEMyKSxdDQpoZWFkKGxvYWRpbmdzKQ0KcHJpbmMyPC1sb2FkaW5nc1sxOjEwLF0NCmxvYWRpbmdzPC1sb2FkaW5nc1tvcmRlcihsb2FkaW5ncyRQQzIpLF0NCnByaW5jMmI8LWxvYWRpbmdzWzE6MTAsXQ0KaGVhZChwcmluYzIpDQpoZWFkKHByaW5jMmIpDQpwcmluYzI8LXJiaW5kKHByaW5jMixwcmluYzJiKQ0KDQpsb2FkaW5nczwtbG9hZGluZ3Nbb3JkZXIoLWxvYWRpbmdzJFBDMyksXQ0KaGVhZChsb2FkaW5ncykNCnByaW5jMzwtbG9hZGluZ3NbMToxMCxdDQpsb2FkaW5nczwtbG9hZGluZ3Nbb3JkZXIobG9hZGluZ3MkUEMzKSxdDQpwcmluYzNiPC1sb2FkaW5nc1sxOjEwLF0NCmhlYWQocHJpbmMzKQ0KaGVhZChwcmluYzNiKQ0KcHJpbmMzPC1yYmluZChwcmluYzMscHJpbmMzYikNCg0KI3Bsb3RzDQpwYzFzdGltPC1nZ3Bsb3QocHJpbmMxLGFlcyh4PXJlb3JkZXIocm93bmFtZXMocHJpbmMxKSxQQzEpLHk9UEMxLGZpbGw9c2lnbihQQzEpKSkrDQogIGdlb21fY29sKCkrY29vcmRfZmxpcCgpKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uPSdwbGFzbWEnLGJlZ2luID0gLjIsZW5kID0gLjY1KSsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0LCBmYWNlPSJib2xkIixoanVzdCA9IC41KSwNCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvcj0nYmxhY2snKSwNCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yPSdibGFjaycpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2U9ICdib2xkJyxjb2xvcj0nYmxhY2snKSkrDQogbGFicyh0aXRsZT0nUEMxJyx5PSdQQzEgQ29udHJpYnV0aW9uJykrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykNCnBjMnN0aW08LWdncGxvdChwcmluYzIsYWVzKHg9cmVvcmRlcihyb3duYW1lcyhwcmluYzIpLFBDMikseT1QQzIsZmlsbD1zaWduKFBDMikpKStnZW9tX2NvbCgpK2Nvb3JkX2ZsaXAoKStzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uPSdwbGFzbWEnLGJlZ2luID0gLjIsZW5kID0gLjY1KSsNCiAgICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiLGhqdXN0ID0gLjUpLA0KICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yPSdibGFjaycpLA0KICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3I9J2JsYWNrJyksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFjZT0gJ2JvbGQnLGNvbG9yPSdibGFjaycpKSsNCiBsYWJzKHRpdGxlPSdQQzInLHk9J1BDMiBDb250cmlidXRpb24nKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKQ0KDQpwYzNzdGltPC1nZ3Bsb3QocHJpbmMzLGFlcyh4PXJlb3JkZXIocm93bmFtZXMocHJpbmMzKSxQQzMpLHk9UEMzLGZpbGw9c2lnbihQQzMpKSkrZ2VvbV9jb2woKStjb29yZF9mbGlwKCkrc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbj0ncGxhc21hJyxiZWdpbiA9IC4yLGVuZCA9IC42NSkrDQogICAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0LCBmYWNlPSJib2xkIixoanVzdCA9IC41KSwNCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvcj0nYmxhY2snKSwNCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yPSdibGFjaycpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2U9ICdib2xkJyxjb2xvcj0nYmxhY2snKSkrDQogbGFicyh0aXRsZT0nUEMzJyx5PSdQQzMgQ29udHJpYnV0aW9uJykrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykNCg0KbGlicmFyeShncmlkRXh0cmEpDQpncmlkcGNsb2FkaW5nczwtZ3JpZC5hcnJhbmdlKHBjMXN0aW0scGMyc3RpbSxwYzNzdGltLG5yb3c9MSkNCg0KZ2dzYXZlKGZpbGUucGF0aCgiLi8iLCBwYXN0ZTAoInBjbG9hZGluZ3MuaW50ZWdyaW5za2VwdC4iLCBTeXMuRGF0ZSgpLCAiLnBuZyIpKSwgcGxvdCA9IGdyaWRwY2xvYWRpbmdzLCBoZWlnaHQgPSA0LCB3aWR0aCA9IDgsIHVuaXRzID0gImluIixkcGkgPSA2MDApDQojIw0KDQpgYGANCg0KYGBge3J9DQogICMjIHRoZSBjb250cmlidXRpb24gdG8gdGhlIHRvdGFsIHZhcmlhbmNlIGZvciBlYWNoIGNvbXBvbmVudA0KICAgICBwZXJjZW50VmFyIDwtIDEwMCoocGNhJHNkZXZeMiAvIHN1bSggcGNhJHNkZXZeMiApKQ0KICAgICBzY3JlZV9wbG90PWRhdGEuZnJhbWUocGVyY2VudFZhcikNCiAgICAgc2NyZWVfcGxvdFssMl08LSBjKDE6MTEpDQogICAgIGNvbG5hbWVzKHNjcmVlX3Bsb3QpPC1jKCJWYXJpYW5jZSIsImNvbXBvbmVudF9udW1iZXIiKQ0KICAgICBzY3JlZV9wbG90JGNvbXBvbmVudF9udW1iZXIgPC0gZmFjdG9yKHNjcmVlX3Bsb3QkY29tcG9uZW50X251bWJlciwgbGV2ZWxzID0gYygxOjEyKSxsYWJlbHMgPSBwYXN0ZTAoJ1BDJywgYygxOjEyKSkpDQogICAgcGNzY3JlZTwtIGdncGxvdChzY3JlZV9wbG90LCBtYXBwaW5nPWFlcyh4PWNvbXBvbmVudF9udW1iZXIsIHk9VmFyaWFuY2UpKSsgICAgICAgDQogICAgICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSsNCiAgICAgICBsYWJzKHg9J0NvbXBvbmVudCBOdW1iZXInKSsNCiAgICAgICB0aGVtZSgNCiAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIsaGp1c3QgPSAuNSksDQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3I9J2JsYWNrJyksDQogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvcj0nYmxhY2snKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlPSAnYm9sZCcsY29sb3I9J2JsYWNrJykpDQogICAgIHBjc2NyZWUNCiAgICAgZ2dzYXZlKGZpbGUucGF0aCgiLi8iLCBwYXN0ZTAoInBjc2NyZWUuaW50ZWdyaW5za2VwdC4iLCBTeXMuRGF0ZSgpLCAiLnBuZyIpKSwgcGxvdCA9IHBjc2NyZWUsIGhlaWdodCA9IDMsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iLGRwaSA9IDYwMCkNCg0KYGBgDQoNCmBgYHtyfQ0KIyBDb2xvcnMgZm9yIHBsb3RzIGJlbG93DQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCihteWNvbHMgPC0gYnJld2VyLnBhbCg4LCAiRGFyazIiKVsxOmxlbmd0aCh1bmlxdWUoY29uZGl0aW9uKSldKQ0KbXljb2xzMyA8LWNvbG9yc3BhY2U6OnNlcXVlbnRpYWxfaGNsKDUsICJncmF5cyIpDQpgYGANCg0KYGBge3J9DQojIFNhbXBsZSBkaXN0YW5jZSBoZWF0bWFwDQpzYW1wbGVEaXN0cyA8LSBhcy5tYXRyaXgoZGlzdCh0KGFzc2F5KHJsZCkpKSkNCmxpYnJhcnkoZ3Bsb3RzKQ0KbGlicmFyeSh2aXJpZGlzKQ0KaGVhZChzYW1wbGVEaXN0cykNCmhlYXRtYXAuMihhcy5tYXRyaXgoc2FtcGxlRGlzdHMpLCB0cmFjZT0ibm9uZSIsDQogICAgICAgICAgY29sPXZpcmlkaXMsDQogICAgICAgICAgQ29sU2lkZUNvbG9ycz1teWNvbHMzW2NvbmRpdGlvbl0sIFJvd1NpZGVDb2xvcnM9bXljb2xzM1tjb25kaXRpb25dLA0KICAgICAgICAgIG1hcmdpbj1jKDEwLCAxMCksIG1haW49IlNhbXBsZSBEaXN0YW5jZSBNYXRyaXgiLENvbHY9RixSb3d2PUYsZGVuc2l0eS5pbmZvID0gJ25vbmUnKQ0KYGBgDQoNCmBgYHtyfQ0KI2NyZWF0ZSBtb3JlIGNvbG9yIHBhbGV0cw0Kd2IgPC0gYygid2hpdGUiLCAiYmxhY2siKQ0KY29sMSA8LSBjb2xvclJhbXBQYWxldHRlKGMoIiM3RjAwMDAiLCAicmVkIiwgIiNGRjdGMDAiLCAieWVsbG93IiwgIndoaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJjeWFuIiwgIiMwMDdGRkYiLCAiYmx1ZSIsIiMwMDAwN0YiKSkNCmNvbDIgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCIjNjcwMDFGIiwgIiNCMjE4MkIiLCAiI0Q2NjA0RCIsICIjRjRBNTgyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIjRkREQkM3IiwgIiNGRkZGRkYiLCAiI0QxRTVGMCIsICIjOTJDNURFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIjNDM5M0MzIiwgIiMyMTY2QUMiLCAiIzA1MzA2MSIpKQ0KY29sMyA8LSBjb2xvclJhbXBQYWxldHRlKGMoInJlZCIsICJ3aGl0ZSIsICJibHVlIikpDQpjb2w0IDwtIGNvbG9yUmFtcFBhbGV0dGUoYygiIzdGMDAwMCIsICJyZWQiLCAiI0ZGN0YwMCIsICJ5ZWxsb3ciLCAiIzdGRkY3RiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiY3lhbiIsICIjMDA3RkZGIiwgImJsdWUiLCAiIzAwMDA3RiIpKQ0KY29sNSA8LSBjb2xvclJhbXBQYWxldHRlKGMoJyNmZjAwZmYnLCdtYWdlbnRhJywnIzdmZmY3ZicsJ2N5YW4nKSkNCmNvbDYgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCcjMDA4MDAwJywnZ3JlZW4nLCcjRkY4QzAwJywnZGFya29yYW5nZScpKQ0KY29sNyA8LSBjb2xvclJhbXBQYWxldHRlKGMoJyMxYjllNzcnLCAnZ3JlZW4nLCAnI2Q5NWYwMicsJ29yYW5nZScsJyM3NTcwYjMnLCdwdXJwbGUnKSkNCiNjcmVhdGUgY29ycmVsYXRpb24gcGxvdHMNClZTVGRhdGEgPC0gdnN0KGRkc0Bhc3NheXNAZGF0YUBsaXN0RGF0YSRjb3VudHMpDQpjb3JtYXQgPC0gKGNvcihWU1RkYXRhLCBtZXRob2Q9J3NwZWFybWFuJykpDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeSh2aXJpZGlzKQ0KI3RoaXMgY29ycmVsYXRpb24gcGxvdCB3aWxsIGluY2x1ZGUgY29tcGFyaXNvbnMgb2Ygc2FtcGxlcyB0byB0aGVtc2VsdmVzDQpjb3JycGxvdChjb3JtYXQsIHR5cGU9J3VwcGVyJyxtZXRob2Q9J2NvbG9yJyxjb2w9dmlyaWRpcyhkaXJlY3Rpb249LTEsMTAwMDAwKSxpcy5jb3JyPUYsIHRsLmNvbD0nYmxhY2snLHRpdGxlPSdDb3JyZWxhdGlvbiBNYXRyaXgnLGRpYWc9VCkNCiN0aGlzIHBsb3Qgd2lsbCByZW1vdmUgdGhvc2UgImRpYWdub2FsIiBjb21wYXJpc29ucyB3aGVyZSB0aGUgc2FtcGxlcyBhcmUgY29tcGFyZWQgdG8gdGhlbXNlbHZlcw0KY29ycnBsb3QoY29ybWF0LCB0eXBlPSd1cHBlcicsbWV0aG9kPSdjb2xvcicsY29sPXZpcmlkaXMoZGlyZWN0aW9uPS0xLDEwMDAwMCksaXMuY29ycj1GLCB0bC5jb2w9J2JsYWNrJyx0aXRsZT0nQ29ycmVsYXRpb24gTWF0cml4JyxkaWFnPUYpDQpgYGANCg0KDQoNCg0KYGBge3J9DQojIFdlIGVzdGltYXRlIHRoZSB2YXJpYW5jZSBmb3IgZWFjaCByb3cgaW4gdGhlIGxvZ2NvdW50cyBtYXRyaXgNCmxvZ2NvdW50cyA8LSBjb3VudHMoZGRzLCBub3JtYWxpemVkPVRSVUUpDQp2YXJfZ2VuZXMgPC0gYXBwbHkobG9nY291bnRzLCAxLCB2YXIpDQpoZWFkKHZhcl9nZW5lcykNCmBgYA0KDQoNCmBgYHtyfQ0KI3Bsb3QgaGVhdG1hcHMgdXNpbmcgc3BlY2lmaWMgZ2VuZXMgdXNpbmcgbG9nIGNvdW50cw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KaGVhdG1hcGdlbmVzPC1jKA0KICAnVG5mJywNCiAgJ0lsMicsDQogICdHem1hJywNCiAgJ1ByZjEnLA0KICAnSWZuZycNCikNCmxvZ2NvdW50c2hlYXRtYXA8LWFzLmRhdGEuZnJhbWUobG9nY291bnRzKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCdnZW5lcycpDQpsb2djb3VudHNoZWF0bWFwIDwtIGxvZ2NvdW50c2hlYXRtYXAgJT4lIGZpbHRlcihsb2djb3VudHNoZWF0bWFwJGdlbmVzICVpbiUgaGVhdG1hcGdlbmVzKQ0KbG9nY291bnRzaGVhdG1hcCA8LSBsb2djb3VudHNoZWF0bWFwICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoJ2dlbmVzJykNCmhlYXRtYXAuMihhcy5tYXRyaXgobG9nY291bnRzaGVhdG1hcCksY29sPXZpcmlkaXM6OnBsYXNtYSx0cmFjZT0ibm9uZSIsIG1haW49IlNlbGVjdCBnZW5lcyAxLXN0aW0iLHNjYWxlPSdyb3cnLCBkZW5zaXR5LmluZm8gPSAnbm9uZScsIG1hcmdpbj1jKDgsIDYpLENvbFNpZGVDb2xvcnMgPSBjKCcjMUIxQjFCJywnIzFCMUIxQicsJyMxQjFCMUInLCcjNTg1ODU4JywnIzU4NTg1OCcsJyM1ODU4NTgnLCcjOTY5Njk2JywnIzk2OTY5NicsJyM5Njk2OTYnLCcjRDBEMEQwJywnI0QwRDBEMCcpLHNydENvbCA9IDQ1LGNvbHNlcD1jKDMsNiw5KSxDb2x2PUYsUm93dj1GLGxhYkNvbCA9ICcnKQ0KI25ldyBoZWF0bWFwIHVzaW5nIHRoZXNlIGdlbmVzDQpoZWF0bWFwZ2VuZXM8LWMoDQogICdQZGNkMScsDQogICdDZDI0NCcsDQogICdIYXZjcjInLA0KICAnVGlnaXQnLA0KICAnQ2QyMDByMScsDQogICdLbHJjMScNCikNCmxvZ2NvdW50c2hlYXRtYXA8LWFzLmRhdGEuZnJhbWUobG9nY291bnRzKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCdnZW5lcycpDQpsb2djb3VudHNoZWF0bWFwIDwtIGxvZ2NvdW50c2hlYXRtYXAgJT4lIGZpbHRlcihsb2djb3VudHNoZWF0bWFwJGdlbmVzICVpbiUgaGVhdG1hcGdlbmVzKQ0KbG9nY291bnRzaGVhdG1hcCA8LSBsb2djb3VudHNoZWF0bWFwICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoJ2dlbmVzJykNCmhlYXRtYXAuMihhcy5tYXRyaXgobG9nY291bnRzaGVhdG1hcCksY29sPXZpcmlkaXM6OnBsYXNtYSx0cmFjZT0ibm9uZSIsIG1haW49IlNlbGVjdCBnZW5lcyAyLXN0aW0iLHNjYWxlPSdyb3cnLCBkZW5zaXR5LmluZm8gPSAnbm9uZScsbWFyZ2luPWMoOCwgNiksQ29sU2lkZUNvbG9ycyA9IGMoJyMxQjFCMUInLCcjMUIxQjFCJywnIzFCMUIxQicsJyM1ODU4NTgnLCcjNTg1ODU4JywnIzU4NTg1OCcsJyM5Njk2OTYnLCcjOTY5Njk2JywnIzk2OTY5NicsJyNEMEQwRDAnLCcjRDBEMEQwJyksc3J0Q29sID0gNDUsY29sc2VwPWMoMyw2LDkpLENvbHY9RixSb3d2PUYsbGFiQ29sID0gJycpDQoNCiNuZXcgaGVhdG1hcCB1c2luZyB0aGVzZSBnZW5lcw0KaGVhdG1hcGdlbmVzPC1jKCdDc2YyJywnSXRnYjInLCdQcmYxJywnUGlrM2NkJywnSXRnYWwnLCdUbmYnLCdQcHAzY2EnLCdLbHJrMScsJ1RuZnNmMTAnLCdSYWMyJywnUHRrMmInLCdGeW4nLCdLbHJjMScsJ01hcGszJywnUHJrY2cnLCdLbHJjMicsJ05mYXRjMicsJ0d6bWInLCdOZmF0YzEnLCdGYXNsJywnSWZuZycsJ0ZjZ3I0JywnTGNwMicsJ1VjYnAxJywnSDItZDEnKQ0KbG9nY291bnRzaGVhdG1hcDwtYXMuZGF0YS5mcmFtZShsb2djb3VudHMpICU+JSByb3duYW1lc190b19jb2x1bW4oJ2dlbmVzJykNCmxvZ2NvdW50c2hlYXRtYXAgPC0gbG9nY291bnRzaGVhdG1hcCAlPiUgZmlsdGVyKGxvZ2NvdW50c2hlYXRtYXAkZ2VuZXMgJWluJSBoZWF0bWFwZ2VuZXMpDQpsb2djb3VudHNoZWF0bWFwIDwtIGxvZ2NvdW50c2hlYXRtYXAgJT4lIGNvbHVtbl90b19yb3duYW1lcygnZ2VuZXMnKQ0KaGVhdG1hcC4yKGFzLm1hdHJpeChsb2djb3VudHNoZWF0bWFwKSxjb2w9dmlyaWRpczo6cGxhc21hLHRyYWNlPSJub25lIiwgbWFpbj0iQ3l0b3RveGljaXR5IixzY2FsZT0ncm93JywgZGVuc2l0eS5pbmZvID0gJ25vbmUnLG1hcmdpbj1jKDgsIDYpLENvbFNpZGVDb2xvcnMgPSBjKCcjMUIxQjFCJywnIzFCMUIxQicsJyMxQjFCMUInLCcjNTg1ODU4JywnIzU4NTg1OCcsJyM1ODU4NTgnLCcjOTY5Njk2JywnIzk2OTY5NicsJyM5Njk2OTYnLCcjRDBEMEQwJywnI0QwRDBEMCcpLHNydENvbCA9IDQ1LGNvbHNlcD1jKDMsNiw5KSxjZXhSb3cgPSAxLENvbHY9RixSb3d2PUYsbGFiQ29sID0gJycpDQoNCiNuZXcgaGVhdG1hcCB1c2luZyB0aGVzZSBnZW5lcw0KaGVhdG1hcGdlbmVzPC1jKCdJdGsnLCdDc2YyJywnUGlrM2NkJywnQ2QzZycsJ1RuZicsJ1Jhc2dycDEnLCdQcHAzY2EnLCdHcmFwMicsJ1BhazYnLCdGeW4nLCdNYXBrMycsJ0lsMTAnLCdKdW4nLCdOZmF0YzInLCdDZDhiMScsJ05mYXRjMScsJ0ZvcycsJ01hcGsxNCcsJ0lsMicsJ0lsNScsJ0NkNDBsZycsJ0lmbmcnLCdDZDhhJywnQ2QyOCcsJ0xjcDInLCdQZGNkMScsJ0NhcmQxMScpDQpsb2djb3VudHNoZWF0bWFwPC1hcy5kYXRhLmZyYW1lKGxvZ2NvdW50cykgJT4lIHJvd25hbWVzX3RvX2NvbHVtbignZ2VuZXMnKQ0KbG9nY291bnRzaGVhdG1hcCA8LSBsb2djb3VudHNoZWF0bWFwICU+JSBmaWx0ZXIobG9nY291bnRzaGVhdG1hcCRnZW5lcyAlaW4lIGhlYXRtYXBnZW5lcykNCmxvZ2NvdW50c2hlYXRtYXAgPC0gbG9nY291bnRzaGVhdG1hcCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKCdnZW5lcycpDQpoZWF0bWFwLjIoYXMubWF0cml4KGxvZ2NvdW50c2hlYXRtYXApLGNvbD12aXJpZGlzOjpwbGFzbWEsdHJhY2U9Im5vbmUiLCBtYWluPSJUQ1Igc2lnbmFsbGluZyIsc2NhbGU9J3JvdycsIGRlbnNpdHkuaW5mbyA9ICdub25lJyxtYXJnaW49Yyg2LCA2KSxDb2xTaWRlQ29sb3JzID0gYygnIzFCMUIxQicsJyMxQjFCMUInLCcjMUIxQjFCJywnIzU4NTg1OCcsJyM1ODU4NTgnLCcjNTg1ODU4JywnIzk2OTY5NicsJyM5Njk2OTYnLCcjOTY5Njk2JywnI0QwRDBEMCcsJyNEMEQwRDAnKSxzcnRDb2wgPSA0NSxjb2xzZXA9YygzLDYsOSksY2V4Um93ID0gMSxDb2x2PUYsUm93dj1GLGxhYkNvbCA9ICcnKQ0KDQojbmV3IGhlYXRtYXAgdXNpbmcgdGhlc2UgZ2VuZXMNCmhlYXRtYXBnZW5lczwtYygnQ2Q4NicsJ0p1bicsJ0N4Y2w5JywnVGljYW0yJywnQ2Q4MCcsJ1BpazNjZCcsJ0ZvcycsJ01hcGsxNCcsJ1RuZicsJ0lsMWInLCdDY2w0JywnQ2NsMycsJ0lyZjUnLCdUbHIyJywnTWFwazMnKQ0KbG9nY291bnRzaGVhdG1hcDwtYXMuZGF0YS5mcmFtZShsb2djb3VudHMpICU+JSByb3duYW1lc190b19jb2x1bW4oJ2dlbmVzJykNCmxvZ2NvdW50c2hlYXRtYXAgPC0gbG9nY291bnRzaGVhdG1hcCAlPiUgZmlsdGVyKGxvZ2NvdW50c2hlYXRtYXAkZ2VuZXMgJWluJSBoZWF0bWFwZ2VuZXMpDQpsb2djb3VudHNoZWF0bWFwIDwtIGxvZ2NvdW50c2hlYXRtYXAgJT4lIGNvbHVtbl90b19yb3duYW1lcygnZ2VuZXMnKQ0KaGVhdG1hcC4yKGFzLm1hdHJpeChsb2djb3VudHNoZWF0bWFwKSxjb2w9dmlyaWRpczo6cGxhc21hLHRyYWNlPSJub25lIiwgbWFpbj0iVExSIFNpZ25hbGxpbmciLHNjYWxlPSdyb3cnLCBkZW5zaXR5LmluZm8gPSAnbm9uZScsbWFyZ2luPWMoOCwgNiksQ29sU2lkZUNvbG9ycyA9IGMoJyMxQjFCMUInLCcjMUIxQjFCJywnIzFCMUIxQicsJyM1ODU4NTgnLCcjNTg1ODU4JywnIzU4NTg1OCcsJyM5Njk2OTYnLCcjOTY5Njk2JywnIzk2OTY5NicsJyNEMEQwRDAnLCcjRDBEMEQwJyksc3J0Q29sID0gNDUsY29sc2VwPWMoMyw2LDkpLGNleFJvdyA9IDEsQ29sdj1GLFJvd3Y9RixsYWJDb2wgPSAnJykNCmBgYA0KDQpgYGB7cn0NCiNTaHJpbmthZ2Ugb2YgZWZmZWN0IHNpemUNCmxpYnJhcnkoYXNocikNCnJlcy5DRDEwM3ZzQ0Q0OWEgPC0gbGZjU2hyaW5rKGRkcyxjb250cmFzdCA9YygnY29uZGl0aW9uJywnQ0QxMDMnLCdDRDQ5YScpLHR5cGU9J2FzaHInKQ0KcmVzLkNEMTAzdnNETiA8LSBsZmNTaHJpbmsoZGRzLGNvbnRyYXN0ID1jKCdjb25kaXRpb24nLCdDRDEwMycsJ0ROJyksdHlwZT0nYXNocicpDQpyZXMuQ0QxMDN2c0RQIDwtIGxmY1NocmluayhkZHMsY29udHJhc3QgPWMoJ2NvbmRpdGlvbicsJ0NEMTAzJywnRFAnKSx0eXBlPSdhc2hyJykNCnJlcy5DRDQ5YXZzRFAgPC0gbGZjU2hyaW5rKGRkcyxjb250cmFzdCA9YygnY29uZGl0aW9uJywnQ0Q0OWEnLCdEUCcpLHR5cGU9J2FzaHInKQ0KcmVzLkNENDlhdnNETiA8LSBsZmNTaHJpbmsoZGRzLGNvbnRyYXN0ID1jKCdjb25kaXRpb24nLCdDRDQ5YScsJ0ROJyksdHlwZT0nYXNocicpDQpyZXMuRFB2c0ROIDwtIGxmY1NocmluayhkZHMsY29udHJhc3QgPWMoJ2NvbmRpdGlvbicsJ0RQJywnRE4nKSx0eXBlPSdhc2hyJykNCg0KIyBHZXQgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gcmVzdWx0cw0KcmVzLkNEMTAzdnNDRDQ5YSA8LSByZXMuQ0QxMDN2c0NENDlhW3Jlcy5DRDEwM3ZzQ0Q0OWEkYmFzZU1lYW4+MTAsXQ0KcmVzLkNEMTAzdnNETiA8LSByZXMuQ0QxMDN2c0ROW3Jlcy5DRDEwM3ZzRE4kYmFzZU1lYW4+MTAsXQ0KcmVzLkNEMTAzdnNEUCA8LSByZXMuQ0QxMDN2c0RQW3Jlcy5DRDEwM3ZzRFAkYmFzZU1lYW4+MTAsXQ0KcmVzLkNENDlhdnNEUCA8LSByZXMuQ0Q0OWF2c0RQW3Jlcy5DRDQ5YXZzRFAkYmFzZU1lYW4+MTAsXQ0KcmVzLkNENDlhdnNETiA8LSByZXMuQ0Q0OWF2c0ROW3Jlcy5DRDQ5YXZzRE4kYmFzZU1lYW4+MTAsXQ0KcmVzLkRQdnNETiA8LSByZXMuRFB2c0ROW3Jlcy5EUHZzRE4kYmFzZU1lYW4+MTAsXQ0KDQpyZXMuQ0QxMDN2c0NENDlhIDwtIG5hLm9taXQocmVzLkNEMTAzdnNDRDQ5YSkNCnJlcy5DRDEwM3ZzRE4gIDwtIG5hLm9taXQocmVzLkNEMTAzdnNETikNCnJlcy5DRDEwM3ZzRFAgPC0gbmEub21pdChyZXMuQ0QxMDN2c0RQKQ0KcmVzLkNENDlhdnNEUCA8LSBuYS5vbWl0KHJlcy5DRDQ5YXZzRFApDQpyZXMuQ0Q0OWF2c0ROICA8LSBuYS5vbWl0KHJlcy5DRDQ5YXZzRE4pDQpyZXMuRFB2c0ROIDwtIG5hLm9taXQocmVzLkRQdnNETikNCg0KcmVzLkNEMTAzdnNDRDQ5YVshY29tcGxldGUuY2FzZXMocmVzLkNEMTAzdnNDRDQ5YSksXQ0KcmVzLkNEMTAzdnNETlshY29tcGxldGUuY2FzZXMocmVzLkNEMTAzdnNETiksXQ0KcmVzLkNEMTAzdnNEUFshY29tcGxldGUuY2FzZXMocmVzLkNEMTAzdnNEUCksXQ0KcmVzLkNENDlhdnNEUFshY29tcGxldGUuY2FzZXMocmVzLkNENDlhdnNEUCksXQ0KcmVzLkNENDlhdnNETlshY29tcGxldGUuY2FzZXMocmVzLkNENDlhdnNETiksXQ0KcmVzLkRQdnNETlshY29tcGxldGUuY2FzZXMocmVzLkRQdnNETiksXQ0KDQojSG93IG1hbnkgcmVzdWx0cyBoYXZlIGEgcCB2YWx1ZSBvZiBsZXNzIHRoYW4gMC4wNT8NCnRhYmxlKHJlcy5DRDEwM3ZzQ0Q0OWEkcGFkajwwLjA1KQ0KdGFibGUocmVzLkNEMTAzdnNETiRwYWRqPDAuMDUpDQp0YWJsZShyZXMuQ0QxMDN2c0RQJHBhZGo8MC4wNSkNCnRhYmxlKHJlcy5DRDQ5YXZzRFAkcGFkajwwLjA1KQ0KdGFibGUocmVzLkNENDlhdnNETiRwYWRqPDAuMDUpDQp0YWJsZShyZXMuRFB2c0ROJHBhZGo8MC4wNSkNCg0KIyMgT3JkZXIgYnkgYWRqdXN0ZWQgcC12YWx1ZQ0KcmVzLkNEMTAzdnNDRDQ5YSA8LSByZXMuQ0QxMDN2c0NENDlhW29yZGVyKHJlcy5DRDEwM3ZzQ0Q0OWEkcGFkaiksIF0NCnJlcy5DRDEwM3ZzRE4gPC0gcmVzLkNEMTAzdnNETltvcmRlcihyZXMuQ0QxMDN2c0ROJHBhZGopLCBdDQpyZXMuQ0QxMDN2c0RQIDwtIHJlcy5DRDEwM3ZzRFBbb3JkZXIocmVzLkNEMTAzdnNEUCRwYWRqKSwgXQ0KcmVzLkNENDlhdnNEUCA8LSByZXMuQ0Q0OWF2c0RQW29yZGVyKHJlcy5DRDQ5YXZzRFAkcGFkaiksIF0NCnJlcy5DRDQ5YXZzRE4gPC0gcmVzLkNENDlhdnNETltvcmRlcihyZXMuQ0Q0OWF2c0ROJHBhZGopLCBdDQpyZXMuRFB2c0ROIDwtIHJlcy5EUHZzRE5bb3JkZXIocmVzLkRQdnNETiRwYWRqKSwgXQ0KDQojbG9vayBhdCB0aGUgZmlyc3QgZmV3IGxpbmVzDQpoZWFkKHJlcy5DRDEwM3ZzQ0Q0OWEpDQpoZWFkKHJlcy5DRDEwM3ZzRE4pDQpoZWFkKHJlcy5DRDEwM3ZzRFApDQpoZWFkKHJlcy5DRDQ5YXZzRFApDQpoZWFkKHJlcy5DRDQ5YXZzRE4pDQpoZWFkKHJlcy5EUHZzRE4pDQpgYGANCg0KYGBge3J9DQojTUEgcGxvdHMNCiNBbiBNQS1wbG90IChEdWRvaXQgZXQgYWwuIDIwMDIpIHByb3ZpZGVzIGEgdXNlZnVsIG92ZXJ2aWV3IGZvciB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBlc3RpbWF0ZWQgY29lZmZpY2llbnRzIGluIHRoZSBtb2RlbCwgZS5nLiB0aGUgY29tcGFyaXNvbnMgb2YgaW50ZXJlc3QsIGFjcm9zcyBhbGwgZ2VuZXMuIE9uIHRoZSB5LWF4aXMsIHRoZSDigJxN4oCdIHN0YW5kcyBmb3Ig4oCcbWludXPigJ0g4oCTIHN1YnRyYWN0aW9uIG9mIGxvZyB2YWx1ZXMgaXMgZXF1aXZhbGVudCB0byB0aGUgbG9nIG9mIHRoZSByYXRpbyDigJMgYW5kIG9uIHRoZSB4LWF4aXMsIHRoZSDigJxB4oCdIHN0YW5kcyBmb3Ig4oCcYXZlcmFnZeKAnS4gWW91IG1heSBoZWFyIHRoaXMgcGxvdCBhbHNvIHJlZmVycmVkIHRvIGFzIGEgbWVhbi1kaWZmZXJlbmNlIHBsb3QsIG9yIGEgQmxhbmQtQWx0bWFuIHBsb3QuDQpwbG90TUEocmVzLkNEMTAzdnNEUCwgeWxpbT1jKC0yLDIpLGNvbE5vblNpZz0iIzQ0MDE1NEZGIixjb2xTaWc9IiMyMTkwOENGRiIsY29sTGluZT0iI0ZERTcyNUZGIikNCnBsb3RNQShyZXMuQ0QxMDN2c0ROLCB5bGltPWMoLTIsMiksY29sTm9uU2lnPSIjNDQwMTU0RkYiLGNvbFNpZz0iIzIxOTA4Q0ZGIixjb2xMaW5lPSIjRkRFNzI1RkYiKQ0KcGxvdE1BKHJlcy5DRDEwM3ZzQ0Q0OWEsIHlsaW09YygtMiwyKSxjb2xOb25TaWc9IiM0NDAxNTRGRiIsY29sU2lnPSIjMjE5MDhDRkYiLGNvbExpbmU9IiNGREU3MjVGRiIpDQpwbG90TUEocmVzLkNENDlhdnNEUCwgeWxpbT1jKC0yLDIpLGNvbE5vblNpZz0iIzQ0MDE1NEZGIixjb2xTaWc9IiMyMTkwOENGRiIsY29sTGluZT0iI0ZERTcyNUZGIikNCnBsb3RNQShyZXMuQ0Q0OWF2c0ROLCB5bGltPWMoLTIsMiksY29sTm9uU2lnPSIjNDQwMTU0RkYiLGNvbFNpZz0iIzIxOTA4Q0ZGIixjb2xMaW5lPSIjRkRFNzI1RkYiKQ0KcGxvdE1BKHJlcy5EUHZzRE4sIHlsaW09YygtMiwyKSxjb2xOb25TaWc9IiM0NDAxNTRGRiIsY29sU2lnPSIjMjE5MDhDRkYiLGNvbExpbmU9IiNGREU3MjVGRiIpDQoNCmBgYA0KDQpgYGB7cn0NCiNJSFcNCiNydW4gSUhXIHBhY2thZ2UgKGluZGVwZW5kZW50IGh5cG90aGVzaXMgdGVzdGluZykgZnJvbSB0aGlzIHBhcGVyOiANCiNodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvdmlnbmV0dGVzL0lIVy9pbnN0L2RvYy9pbnRyb2R1Y3Rpb25fdG9faWh3Lmh0bWwjYW4tZXhhbXBsZS1ybmEtc2VxLWRpZmZlcmVudGlhbC1leHByZXNzaW9uDQojaHR0cHM6Ly93d3cubmF0dXJlLmNvbS9hcnRpY2xlcy9ubWV0aC4zODg1DQojSW5kZXBlbmRlbnQgaHlwb3RoZXNpcyB3ZWlnaHRpbmcgaXMgYSBtb3JlIHBvd2VyZnVsIHdheSB0byBpbnZlc3RpZ2F0ZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbi4gVGhlIGNpdGF0aW9ucyBhYm92ZSBleHBsYWluIGluIGZ1bGwuDQpsaWJyYXJ5KCJJSFciKQ0KcmVzLkNEMTAzdnNDRDQ5YURGIDwtIGFzLmRhdGEuZnJhbWUocmVzLkNEMTAzdnNDRDQ5YSkNCnJlcy5DRDEwM3ZzRFBERiA8LSBhcy5kYXRhLmZyYW1lKHJlcy5DRDEwM3ZzRFApDQpyZXMuQ0QxMDN2c0ROREYgPC0gYXMuZGF0YS5mcmFtZShyZXMuQ0QxMDN2c0ROKQ0KcmVzLkNENDlhdnNEUERGIDwtIGFzLmRhdGEuZnJhbWUocmVzLkNENDlhdnNEUCkNCnJlcy5DRDQ5YXZzRE5ERiA8LSBhcy5kYXRhLmZyYW1lKHJlcy5DRDQ5YXZzRE4pDQpyZXMuRFB2c0ROREYgPC0gYXMuZGF0YS5mcmFtZShyZXMuRFB2c0ROKQ0KDQojSW4gcGFydGljdWxhciwgd2UgaGF2ZSBwLXZhbHVlcyBhbmQgYmFzZU1lYW4gKGkuZS4sIHRoZSBtZWFuIG9mIG5vcm1hbGl6ZWQgY291bnRzKSBmb3IgZWFjaCBnZW5lLiBBcyBhcmd1ZWQgaW4gdGhlIERFU2VxMiBwYXBlciwgdGhlc2UgdHdvIHN0YXRpc3RpY3MgYXJlIGFwcHJveGltYXRlbHkgaW5kZXBlbmRlbnQgdW5kZXIgdGhlIG51bGwgaHlwb3RoZXNpcy4gVGh1cyB3ZSBoYXZlIGFsbCB0aGUgaW5ncmVkaWVudHMgbmVjZXNzYXJ5IGZvciBhIElIVyBhbmFseXNpcyAocC12YWx1ZXMgYW5kIGNvdmFyaWF0ZXMpLCB3aGljaCB3ZSB3aWxsIGFwcGx5IGF0IGEgc2lnbmlmaWNhbmNlIGxldmVsIDAuMDUuDQppaHcucmVzLkNEMTAzdnNDRDQ5YSA8LSBpaHcocHZhbHVlIH4gYmFzZU1lYW4sICBkYXRhID0gcmVzLkNEMTAzdnNDRDQ5YURGLCBhbHBoYSA9IDAuMDUpDQppaHcucmVzLkNEMTAzdnNEUCA8LSBpaHcocHZhbHVlIH4gYmFzZU1lYW4sICBkYXRhID0gcmVzLkNEMTAzdnNEUERGLCBhbHBoYSA9IDAuMDUpDQppaHcucmVzLkNEMTAzdnNETiA8LSBpaHcocHZhbHVlIH4gYmFzZU1lYW4sICBkYXRhID0gcmVzLkNEMTAzdnNETkRGLCBhbHBoYSA9IDAuMDUpDQppaHcucmVzLkNENDlhdnNEUCA8LSBpaHcocHZhbHVlIH4gYmFzZU1lYW4sICBkYXRhID0gcmVzLkNENDlhdnNEUERGLCBhbHBoYSA9IDAuMDUpDQppaHcucmVzLkNENDlhdnNETiA8LSBpaHcocHZhbHVlIH4gYmFzZU1lYW4sICBkYXRhID0gcmVzLkNENDlhdnNETkRGLCBhbHBoYSA9IDAuMDUpDQppaHcucmVzLkRQdnNETiA8LSBpaHcocHZhbHVlIH4gYmFzZU1lYW4sICBkYXRhID0gcmVzLkRQdnNETkRGLCBhbHBoYSA9IDAuMDUpDQojVGhpcyByZXR1cm5zIGFuIG9iamVjdCBvZiB0aGUgY2xhc3MgaWh3UmVzdWx0Lg0KYGBgDQoNCg0KDQpgYGB7cn0NCiNhZGQgdGhlIGdlbmUgbmFtZXMgdG8gdGhlIGlodyBkZiBzbyB3ZSBjYW4gZ2V0IHRoZSBnZW5lIG5hbWVzIHRvIGdpdmUgdG8gZW5yaWNocg0KI05vdGUgdGhlIHdlaWdodGVkIHAgdmFsdWUgY3V0b2ZmIGlzIDAuMDUgYW5kIHRoYXQgdGhlIGxvZzJmb2xkY2hhbmdlIG11c3QgYmUgDQojZ3JlYXRlciB0aGFuIDEgb3IgbGVzcyB0aGFuIC0xIHRvIGJlIGNvbnNpZGVyZWQgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkDQojQ0QxMDN2c0NENDlhDQpkZS5paHcucmVzLkNEMTAzdnNDRDQ5YSA8LSBpaHcucmVzLkNEMTAzdnNDRDQ5YUBkZg0KZGltKHJlcy5DRDEwM3ZzQ0Q0OWEpDQpkaW0oZGUuaWh3LnJlcy5DRDEwM3ZzQ0Q0OWEpDQpnZW5lcy5yZXMuQ0QxMDN2c0NENDlhIDwtIHJvd25hbWVzKHJlcy5DRDEwM3ZzQ0Q0OWEpDQpnZW5lcy5yZXMuQ0QxMDN2c0NENDlhIDwtIGFzLnZlY3RvcihnZW5lcy5yZXMuQ0QxMDN2c0NENDlhKQ0KZGUuaWh3LnJlcy5DRDEwM3ZzQ0Q0OWFbImdlbmUiXSA8LSBnZW5lcy5yZXMuQ0QxMDN2c0NENDlhDQppaHcucmVzLkNEMTAzdnNDRDQ5YS5hbGwgPC0gZGUuaWh3LnJlcy5DRDEwM3ZzQ0Q0OWENCmRlLmlody5yZXMuQ0QxMDN2c0NENDlhIDwtIGRlLmlody5yZXMuQ0QxMDN2c0NENDlhW2RlLmlody5yZXMuQ0QxMDN2c0NENDlhWywid2VpZ2h0ZWRfcHZhbHVlIl08MC4wNSxdDQpkaW0oZGUuaWh3LnJlcy5DRDEwM3ZzQ0Q0OWEpDQppaHcuZ2VuZXMucmVzLkNEMTAzdnNDRDQ5YSA8LSBkZS5paHcucmVzLkNEMTAzdnNDRDQ5YSRnZW5lDQpoZWFkKGlody5nZW5lcy5yZXMuQ0QxMDN2c0NENDlhKQ0KaWh3LnJlcy5DRDEwM3ZzQ0Q0OWEuYWxsIDwtIGRhdGEuZnJhbWUoaWh3LnJlcy5DRDEwM3ZzQ0Q0OWEuYWxsLCByb3cubmFtZXMgPSA4KQ0KaWh3LnJlcy5DRDEwM3ZzQ0Q0OWEuYWxsWydsb2cyRm9sZENoYW5nZSddIDwtIGFzLnZlY3RvcihyZXMuQ0QxMDN2c0NENDlhJGxvZzJGb2xkQ2hhbmdlKQ0KI21ha2Ugc2V0IG9mIGdlbmVzIHRoYXQgYXJlIHVwIGFuZCBkb3duIHJlZ3VsYXRlZA0KaWh3LmdlbmVzLnJlcy5DRDEwM3ZzQ0Q0OWEudXAgPC0gaWh3LnJlcy5DRDEwM3ZzQ0Q0OWEuYWxsW2lody5yZXMuQ0QxMDN2c0NENDlhLmFsbFssImxvZzJGb2xkQ2hhbmdlIl0+MSxdDQppaHcuZ2VuZXMucmVzLkNEMTAzdnNDRDQ5YS51cCA8LSBpaHcuZ2VuZXMucmVzLkNEMTAzdnNDRDQ5YS51cFtpaHcuZ2VuZXMucmVzLkNEMTAzdnNDRDQ5YS51cFssIndlaWdodGVkX3B2YWx1ZSJdPDAuMDUsXQ0KaWh3LmdlbmVzLnJlcy5DRDEwM3ZzQ0Q0OWEuZG93biA8LSBpaHcucmVzLkNEMTAzdnNDRDQ5YS5hbGxbaWh3LnJlcy5DRDEwM3ZzQ0Q0OWEuYWxsWywibG9nMkZvbGRDaGFuZ2UiXTwoLTEpLF0NCmlody5nZW5lcy5yZXMuQ0QxMDN2c0NENDlhLmRvd24gPC0gaWh3LmdlbmVzLnJlcy5DRDEwM3ZzQ0Q0OWEuZG93bltpaHcuZ2VuZXMucmVzLkNEMTAzdnNDRDQ5YS5kb3duWywid2VpZ2h0ZWRfcHZhbHVlIl08MC4wNSxdDQp1cGdlbmVzLmlody5yZXMuQ0QxMDN2c0NENDlhIDwtIHJvd25hbWVzKGlody5nZW5lcy5yZXMuQ0QxMDN2c0NENDlhLnVwKQ0KZG93bmdlbmVzLmlody5yZXMuQ0QxMDN2c0NENDlhIDwtIHJvd25hbWVzKGlody5nZW5lcy5yZXMuQ0QxMDN2c0NENDlhLmRvd24pDQoNCiNDRDEwM3ZzRFANCmRlLmlody5yZXMuQ0QxMDN2c0RQIDwtIGlody5yZXMuQ0QxMDN2c0RQQGRmDQpkaW0ocmVzLkNEMTAzdnNEUCkNCmRpbShkZS5paHcucmVzLkNEMTAzdnNEUCkNCmdlbmVzLnJlcy5DRDEwM3ZzRFAgPC0gcm93bmFtZXMocmVzLkNEMTAzdnNEUCkNCmdlbmVzLnJlcy5DRDEwM3ZzRFAgPC0gYXMudmVjdG9yKGdlbmVzLnJlcy5DRDEwM3ZzRFApDQpkZS5paHcucmVzLkNEMTAzdnNEUFsiZ2VuZSJdIDwtIGdlbmVzLnJlcy5DRDEwM3ZzRFANCmlody5yZXMuQ0QxMDN2c0RQLmFsbCA8LSBkZS5paHcucmVzLkNEMTAzdnNEUA0KZGUuaWh3LnJlcy5DRDEwM3ZzRFAgPC0gZGUuaWh3LnJlcy5DRDEwM3ZzRFBbZGUuaWh3LnJlcy5DRDEwM3ZzRFBbLCJ3ZWlnaHRlZF9wdmFsdWUiXTwwLjA1LF0NCmRpbShkZS5paHcucmVzLkNEMTAzdnNEUCkNCmlody5nZW5lcy5yZXMuQ0QxMDN2c0RQIDwtIGRlLmlody5yZXMuQ0QxMDN2c0RQJGdlbmUNCmhlYWQoaWh3LmdlbmVzLnJlcy5DRDEwM3ZzRFApDQppaHcucmVzLkNEMTAzdnNEUC5hbGwgPC0gZGF0YS5mcmFtZShpaHcucmVzLkNEMTAzdnNEUC5hbGwsIHJvdy5uYW1lcyA9IDgpDQppaHcucmVzLkNEMTAzdnNEUC5hbGxbJ2xvZzJGb2xkQ2hhbmdlJ10gPC0gYXMudmVjdG9yKHJlcy5DRDEwM3ZzRFAkbG9nMkZvbGRDaGFuZ2UpDQojbWFrZSBzZXQgb2YgZ2VuZXMgdGhhdCBhcmUgdXAgYW5kIGRvd24gcmVndWxhdGVkDQppaHcuZ2VuZXMucmVzLkNEMTAzdnNEUC51cCA8LSBpaHcucmVzLkNEMTAzdnNEUC5hbGxbaWh3LnJlcy5DRDEwM3ZzRFAuYWxsWywibG9nMkZvbGRDaGFuZ2UiXT4xLF0NCmlody5nZW5lcy5yZXMuQ0QxMDN2c0RQLnVwIDwtIGlody5nZW5lcy5yZXMuQ0QxMDN2c0RQLnVwW2lody5nZW5lcy5yZXMuQ0QxMDN2c0RQLnVwWywid2VpZ2h0ZWRfcHZhbHVlIl08MC4wNSxdDQppaHcuZ2VuZXMucmVzLkNEMTAzdnNEUC5kb3duIDwtIGlody5yZXMuQ0QxMDN2c0RQLmFsbFtpaHcucmVzLkNEMTAzdnNEUC5hbGxbLCJsb2cyRm9sZENoYW5nZSJdPCgtMSksXQ0KaWh3LmdlbmVzLnJlcy5DRDEwM3ZzRFAuZG93biA8LSBpaHcuZ2VuZXMucmVzLkNEMTAzdnNEUC5kb3duW2lody5nZW5lcy5yZXMuQ0QxMDN2c0RQLmRvd25bLCJ3ZWlnaHRlZF9wdmFsdWUiXTwwLjA1LF0NCnVwZ2VuZXMuaWh3LnJlcy5DRDEwM3ZzRFAgPC0gcm93bmFtZXMoaWh3LmdlbmVzLnJlcy5DRDEwM3ZzRFAudXApDQpkb3duZ2VuZXMuaWh3LnJlcy5DRDEwM3ZzRFAgPC0gcm93bmFtZXMoaWh3LmdlbmVzLnJlcy5DRDEwM3ZzRFAuZG93bikNCg0KI0NEMTAzdnNETg0KZGUuaWh3LnJlcy5DRDEwM3ZzRE4gPC0gaWh3LnJlcy5DRDEwM3ZzRE5AZGYNCmRpbShyZXMuQ0QxMDN2c0ROKQ0KZGltKGRlLmlody5yZXMuQ0QxMDN2c0ROKQ0KZ2VuZXMucmVzLkNEMTAzdnNETiA8LSByb3duYW1lcyhyZXMuQ0QxMDN2c0ROKQ0KZ2VuZXMucmVzLkNEMTAzdnNETiA8LSBhcy52ZWN0b3IoZ2VuZXMucmVzLkNEMTAzdnNETikNCmRlLmlody5yZXMuQ0QxMDN2c0ROWyJnZW5lIl0gPC0gZ2VuZXMucmVzLkNEMTAzdnNETg0KaWh3LnJlcy5DRDEwM3ZzRE4uYWxsIDwtIGRlLmlody5yZXMuQ0QxMDN2c0RODQpkZS5paHcucmVzLkNEMTAzdnNETiA8LSBkZS5paHcucmVzLkNEMTAzdnNETltkZS5paHcucmVzLkNEMTAzdnNETlssIndlaWdodGVkX3B2YWx1ZSJdPDAuMDUsXQ0KZGltKGRlLmlody5yZXMuQ0QxMDN2c0ROKQ0KaWh3LmdlbmVzLnJlcy5DRDEwM3ZzRE4gPC0gZGUuaWh3LnJlcy5DRDEwM3ZzRE4kZ2VuZQ0KaGVhZChpaHcuZ2VuZXMucmVzLkNEMTAzdnNETikNCmlody5yZXMuQ0QxMDN2c0ROLmFsbCA8LSBkYXRhLmZyYW1lKGlody5yZXMuQ0QxMDN2c0ROLmFsbCwgcm93Lm5hbWVzID0gOCkNCmlody5yZXMuQ0QxMDN2c0ROLmFsbFsnbG9nMkZvbGRDaGFuZ2UnXSA8LSBhcy52ZWN0b3IocmVzLkNEMTAzdnNETiRsb2cyRm9sZENoYW5nZSkNCiNtYWtlIHNldCBvZiBnZW5lcyB0aGF0IGFyZSB1cCBhbmQgZG93biByZWd1bGF0ZWQNCmlody5nZW5lcy5yZXMuQ0QxMDN2c0ROLnVwIDwtIGlody5yZXMuQ0QxMDN2c0ROLmFsbFtpaHcucmVzLkNEMTAzdnNETi5hbGxbLCJsb2cyRm9sZENoYW5nZSJdPjEsXQ0KaWh3LmdlbmVzLnJlcy5DRDEwM3ZzRE4udXAgPC0gaWh3LmdlbmVzLnJlcy5DRDEwM3ZzRE4udXBbaWh3LmdlbmVzLnJlcy5DRDEwM3ZzRE4udXBbLCJ3ZWlnaHRlZF9wdmFsdWUiXTwwLjA1LF0NCmlody5nZW5lcy5yZXMuQ0QxMDN2c0ROLmRvd24gPC0gaWh3LnJlcy5DRDEwM3ZzRE4uYWxsW2lody5yZXMuQ0QxMDN2c0ROLmFsbFssImxvZzJGb2xkQ2hhbmdlIl08KC0xKSxdDQppaHcuZ2VuZXMucmVzLkNEMTAzdnNETi5kb3duIDwtIGlody5nZW5lcy5yZXMuQ0QxMDN2c0ROLmRvd25baWh3LmdlbmVzLnJlcy5DRDEwM3ZzRE4uZG93blssIndlaWdodGVkX3B2YWx1ZSJdPDAuMDUsXQ0KdXBnZW5lcy5paHcucmVzLkNEMTAzdnNETiA8LSByb3duYW1lcyhpaHcuZ2VuZXMucmVzLkNEMTAzdnNETi51cCkNCmRvd25nZW5lcy5paHcucmVzLkNEMTAzdnNETiA8LSByb3duYW1lcyhpaHcuZ2VuZXMucmVzLkNEMTAzdnNETi5kb3duKQ0KDQojQ0Q0OWF2c0RQDQpkZS5paHcucmVzLkNENDlhdnNEUCA8LSBpaHcucmVzLkNENDlhdnNEUEBkZg0KZGltKHJlcy5DRDQ5YXZzRFApDQpkaW0oZGUuaWh3LnJlcy5DRDQ5YXZzRFApDQpnZW5lcy5yZXMuQ0Q0OWF2c0RQIDwtIHJvd25hbWVzKHJlcy5DRDQ5YXZzRFApDQpnZW5lcy5yZXMuQ0Q0OWF2c0RQIDwtIGFzLnZlY3RvcihnZW5lcy5yZXMuQ0Q0OWF2c0RQKQ0KZGUuaWh3LnJlcy5DRDQ5YXZzRFBbImdlbmUiXSA8LSBnZW5lcy5yZXMuQ0Q0OWF2c0RQDQppaHcucmVzLkNENDlhdnNEUC5hbGwgPC0gZGUuaWh3LnJlcy5DRDQ5YXZzRFANCmRlLmlody5yZXMuQ0Q0OWF2c0RQIDwtIGRlLmlody5yZXMuQ0Q0OWF2c0RQW2RlLmlody5yZXMuQ0Q0OWF2c0RQWywid2VpZ2h0ZWRfcHZhbHVlIl08MC4wNSxdDQpkaW0oZGUuaWh3LnJlcy5DRDQ5YXZzRFApDQppaHcuZ2VuZXMucmVzLkNENDlhdnNEUCA8LSBkZS5paHcucmVzLkNENDlhdnNEUCRnZW5lDQpoZWFkKGlody5nZW5lcy5yZXMuQ0Q0OWF2c0RQKQ0KaWh3LnJlcy5DRDQ5YXZzRFAuYWxsIDwtIGRhdGEuZnJhbWUoaWh3LnJlcy5DRDQ5YXZzRFAuYWxsLCByb3cubmFtZXMgPSA4KQ0KaWh3LnJlcy5DRDQ5YXZzRFAuYWxsWydsb2cyRm9sZENoYW5nZSddIDwtIGFzLnZlY3RvcihyZXMuQ0Q0OWF2c0RQJGxvZzJGb2xkQ2hhbmdlKQ0KI21ha2Ugc2V0IG9mIGdlbmVzIHRoYXQgYXJlIHVwIGFuZCBkb3duIHJlZ3VsYXRlZA0KaWh3LmdlbmVzLnJlcy5DRDQ5YXZzRFAudXAgPC0gaWh3LnJlcy5DRDQ5YXZzRFAuYWxsW2lody5yZXMuQ0Q0OWF2c0RQLmFsbFssImxvZzJGb2xkQ2hhbmdlIl0+MSxdDQppaHcuZ2VuZXMucmVzLkNENDlhdnNEUC51cCA8LSBpaHcuZ2VuZXMucmVzLkNENDlhdnNEUC51cFtpaHcuZ2VuZXMucmVzLkNENDlhdnNEUC51cFssIndlaWdodGVkX3B2YWx1ZSJdPDAuMDUsXQ0KaWh3LmdlbmVzLnJlcy5DRDQ5YXZzRFAuZG93biA8LSBpaHcucmVzLkNENDlhdnNEUC5hbGxbaWh3LnJlcy5DRDQ5YXZzRFAuYWxsWywibG9nMkZvbGRDaGFuZ2UiXTwoLTEpLF0NCmlody5nZW5lcy5yZXMuQ0Q0OWF2c0RQLmRvd24gPC0gaWh3LmdlbmVzLnJlcy5DRDQ5YXZzRFAuZG93bltpaHcuZ2VuZXMucmVzLkNENDlhdnNEUC5kb3duWywid2VpZ2h0ZWRfcHZhbHVlIl08MC4wNSxdDQp1cGdlbmVzLmlody5yZXMuQ0Q0OWF2c0RQIDwtIHJvd25hbWVzKGlody5nZW5lcy5yZXMuQ0Q0OWF2c0RQLnVwKQ0KZG93bmdlbmVzLmlody5yZXMuQ0Q0OWF2c0RQIDwtIHJvd25hbWVzKGlody5nZW5lcy5yZXMuQ0Q0OWF2c0RQLmRvd24pDQoNCiNDRDQ5YXZzRE4NCmRlLmlody5yZXMuQ0Q0OWF2c0ROIDwtIGlody5yZXMuQ0Q0OWF2c0ROQGRmDQpkaW0ocmVzLkNENDlhdnNETikNCmRpbShkZS5paHcucmVzLkNENDlhdnNETikNCmdlbmVzLnJlcy5DRDQ5YXZzRE4gPC0gcm93bmFtZXMocmVzLkNENDlhdnNETikNCmdlbmVzLnJlcy5DRDQ5YXZzRE4gPC0gYXMudmVjdG9yKGdlbmVzLnJlcy5DRDQ5YXZzRE4pDQpkZS5paHcucmVzLkNENDlhdnNETlsiZ2VuZSJdIDwtIGdlbmVzLnJlcy5DRDQ5YXZzRE4NCmlody5yZXMuQ0Q0OWF2c0ROLmFsbCA8LSBkZS5paHcucmVzLkNENDlhdnNETg0KZGUuaWh3LnJlcy5DRDQ5YXZzRE4gPC0gZGUuaWh3LnJlcy5DRDQ5YXZzRE5bZGUuaWh3LnJlcy5DRDQ5YXZzRE5bLCJ3ZWlnaHRlZF9wdmFsdWUiXTwwLjA1LF0NCmRpbShkZS5paHcucmVzLkNENDlhdnNETikNCmlody5nZW5lcy5yZXMuQ0Q0OWF2c0ROIDwtIGRlLmlody5yZXMuQ0Q0OWF2c0ROJGdlbmUNCmhlYWQoaWh3LmdlbmVzLnJlcy5DRDQ5YXZzRE4pDQppaHcucmVzLkNENDlhdnNETi5hbGwgPC0gZGF0YS5mcmFtZShpaHcucmVzLkNENDlhdnNETi5hbGwsIHJvdy5uYW1lcyA9IDgpDQppaHcucmVzLkNENDlhdnNETi5hbGxbJ2xvZzJGb2xkQ2hhbmdlJ10gPC0gYXMudmVjdG9yKHJlcy5DRDQ5YXZzRE4kbG9nMkZvbGRDaGFuZ2UpDQojbWFrZSBzZXQgb2YgZ2VuZXMgdGhhdCBhcmUgdXAgYW5kIGRvd24gcmVndWxhdGVkDQppaHcuZ2VuZXMucmVzLkNENDlhdnNETi51cCA8LSBpaHcucmVzLkNENDlhdnNETi5hbGxbaWh3LnJlcy5DRDQ5YXZzRE4uYWxsWywibG9nMkZvbGRDaGFuZ2UiXT4xLF0NCmlody5nZW5lcy5yZXMuQ0Q0OWF2c0ROLnVwIDwtIGlody5nZW5lcy5yZXMuQ0Q0OWF2c0ROLnVwW2lody5nZW5lcy5yZXMuQ0Q0OWF2c0ROLnVwWywid2VpZ2h0ZWRfcHZhbHVlIl08MC4wNSxdDQppaHcuZ2VuZXMucmVzLkNENDlhdnNETi5kb3duIDwtIGlody5yZXMuQ0Q0OWF2c0ROLmFsbFtpaHcucmVzLkNENDlhdnNETi5hbGxbLCJsb2cyRm9sZENoYW5nZSJdPCgtMSksXQ0KaWh3LmdlbmVzLnJlcy5DRDQ5YXZzRE4uZG93biA8LSBpaHcuZ2VuZXMucmVzLkNENDlhdnNETi5kb3duW2lody5nZW5lcy5yZXMuQ0Q0OWF2c0ROLmRvd25bLCJ3ZWlnaHRlZF9wdmFsdWUiXTwwLjA1LF0NCnVwZ2VuZXMuaWh3LnJlcy5DRDQ5YXZzRE4gPC0gcm93bmFtZXMoaWh3LmdlbmVzLnJlcy5DRDQ5YXZzRE4udXApDQpkb3duZ2VuZXMuaWh3LnJlcy5DRDQ5YXZzRE4gPC0gcm93bmFtZXMoaWh3LmdlbmVzLnJlcy5DRDQ5YXZzRE4uZG93bikNCg0KI0RQdnNETg0KZGUuaWh3LnJlcy5EUHZzRE4gPC0gaWh3LnJlcy5EUHZzRE5AZGYNCmRpbShyZXMuRFB2c0ROKQ0KZGltKGRlLmlody5yZXMuRFB2c0ROKQ0KZ2VuZXMucmVzLkRQdnNETiA8LSByb3duYW1lcyhyZXMuRFB2c0ROKQ0KZ2VuZXMucmVzLkRQdnNETiA8LSBhcy52ZWN0b3IoZ2VuZXMucmVzLkRQdnNETikNCmRlLmlody5yZXMuRFB2c0ROWyJnZW5lIl0gPC0gZ2VuZXMucmVzLkRQdnNETg0KaWh3LnJlcy5EUHZzRE4uYWxsIDwtIGRlLmlody5yZXMuRFB2c0RODQpkZS5paHcucmVzLkRQdnNETiA8LSBkZS5paHcucmVzLkRQdnNETltkZS5paHcucmVzLkRQdnNETlssIndlaWdodGVkX3B2YWx1ZSJdPDAuMDUsXQ0KZGltKGRlLmlody5yZXMuRFB2c0ROKQ0KaWh3LmdlbmVzLnJlcy5EUHZzRE4gPC0gZGUuaWh3LnJlcy5EUHZzRE4kZ2VuZQ0KaGVhZChpaHcuZ2VuZXMucmVzLkRQdnNETikNCmlody5yZXMuRFB2c0ROLmFsbCA8LSBkYXRhLmZyYW1lKGlody5yZXMuRFB2c0ROLmFsbCwgcm93Lm5hbWVzID0gOCkNCmlody5yZXMuRFB2c0ROLmFsbFsnbG9nMkZvbGRDaGFuZ2UnXSA8LSBhcy52ZWN0b3IocmVzLkRQdnNETiRsb2cyRm9sZENoYW5nZSkNCiNtYWtlIHNldCBvZiBnZW5lcyB0aGF0IGFyZSB1cCBhbmQgZG93biByZWd1bGF0ZWQNCiNpaHcuZ2VuZXMucmVzLkRQdnNETi51cCA8LSBpaHcucmVzLkRQdnNETi5hbGxbaWh3LnJlcy5EUHZzRE4uYWxsWywid2VpZ2h0ZWRfcHZhbHVlIl08LjA1LF0NCmlody5nZW5lcy5yZXMuRFB2c0ROLnVwIDwtIGlody5yZXMuRFB2c0ROLmFsbFtpaHcucmVzLkRQdnNETi5hbGxbLCJsb2cyRm9sZENoYW5nZSJdPjEsXQ0KaWh3LmdlbmVzLnJlcy5EUHZzRE4udXAgPC0gaWh3LmdlbmVzLnJlcy5EUHZzRE4udXBbaWh3LmdlbmVzLnJlcy5EUHZzRE4udXBbLCJ3ZWlnaHRlZF9wdmFsdWUiXTwwLjA1LF0NCmlody5nZW5lcy5yZXMuRFB2c0ROLmRvd24gPC0gaWh3LnJlcy5EUHZzRE4uYWxsW2lody5yZXMuRFB2c0ROLmFsbFssImxvZzJGb2xkQ2hhbmdlIl08KC0xKSxdDQppaHcuZ2VuZXMucmVzLkRQdnNETi5kb3duIDwtIGlody5nZW5lcy5yZXMuRFB2c0ROLmRvd25baWh3LmdlbmVzLnJlcy5EUHZzRE4uZG93blssIndlaWdodGVkX3B2YWx1ZSJdPDAuMDUsXQ0KdXBnZW5lcy5paHcucmVzLkRQdnNETiA8LSByb3duYW1lcyhpaHcuZ2VuZXMucmVzLkRQdnNETi51cCkNCmRvd25nZW5lcy5paHcucmVzLkRQdnNETiA8LSByb3duYW1lcyhpaHcuZ2VuZXMucmVzLkRQdnNETi5kb3duKQ0KYGBgDQoNCmBgYHtyfQ0KI3NvcnQgYnkgbGZjDQpvcmRlcmVkbGZjIDwtIGlody5yZXMuRFB2c0ROLmFsbFtvcmRlcihpaHcucmVzLkRQdnNETi5hbGwkbG9nMkZvbGRDaGFuZ2UpLCBdDQpoZWFkKG9yZGVyZWRsZmMpDQoja2VlcCBvbmx5IHZhbHVlcyBvZiB3ZWlnaGVkIHAgdmFsdWVzIG9mIDwuMDUNCm9yZGVyZWRsZmM8LW9yZGVyZWRsZmNbb3JkZXJlZGxmY1ssJ3dlaWdodGVkX3B2YWx1ZSddPC4wNSxdIA0KZG93bm9yZGVyZWRsZmM8LW9yZGVyZWRsZmNbMTo1MDAsXQ0Kb3JkZXJlZGxmYyA8LSBvcmRlcmVkbGZjW3JldihzZXFfbGVuKG5yb3cob3JkZXJlZGxmYykpKSwgLCBkcm9wID0gRkFMU0VdDQp1cG9yZGVyZWRsZmM8LW9yZGVyZWRsZmNbMTo1MDAsXQ0KY29tYmluZWRsZmM8LXJiaW5kKHVwb3JkZXJlZGxmYyxkb3dub3JkZXJlZGxmYykNCnJvd25hbWVzbGZjPC1yb3cubmFtZXMoY29tYmluZWRsZmMpDQpoaWdobHlfdmFyaWFibGVfbGNwbSA8LSBsb2djb3VudHNbcm93bmFtZXNsZmMsXQ0KZGltKGhpZ2hseV92YXJpYWJsZV9sY3BtKQ0KaGVhZChoaWdobHlfdmFyaWFibGVfbGNwbSkNCmFzLmRhdGEuZnJhbWUoaGlnaGx5X3ZhcmlhYmxlX2xjcG0pDQp0eXBlKGhpZ2hseV92YXJpYWJsZV9sY3BtKQ0KI3Jlb3JkZXIgdGhpcw0KaGlnaGx5X3ZhcmlhYmxlX2xjcG0gPC0gaGlnaGx5X3ZhcmlhYmxlX2xjcG1bLGMoIkwxX0RQIiwiTDJfRFAiLCJMM19EUCIsICJMMl9DRDQ5YSIsIkwzX0NENDlhIiwiTDFfQ0QxMDMiLCJMMl9DRDEwMyIsIkwzX0NEMTAzIiwgIkwxX0ROIiwgIkwyX0ROIiwiTDNfRE4iKV0NCiMgUGxvdCB0aGUgaGVhdG1hcA0KbXljb2xzMyA8LWNvbG9yc3BhY2U6OnNlcXVlbnRpYWxfaGNsKDUsICJncmF5cyIpDQpoZWF0bWFwLjIoaGlnaGx5X3ZhcmlhYmxlX2xjcG0sY29sPXZpcmlkaXM6OnBsYXNtYSx0cmFjZT0ibm9uZSIsc2NhbGU9J3JvdycsQ29sdiA9IEYsbGFiUm93ID1GLCBsYWJDb2w9IiIsIGRlbmRyb2dyYW0gPSBjKCdub25lJyksIFJvd3Y9RixkZW5zaXR5LmluZm8gPSAnbm9uZScsY29sc2VwPWMoMyw1LDgpLCBtYXJnaW49YygxMCwgMyksIHNydENvbCA9IDQ1LCBDb2xTaWRlQ29sb3JzID0gYygnIzg3NDRmNicsJyM4NzQ0ZjYnLCcjODc0NGY2JywnIzQxNDE0MScsJyM0MTQxNDEnLCcjYWNmYWZhJywnI2FjZmFmYScsJyNhY2ZhZmEnLCcjZjI5NzM3JywnI2YyOTczNycsJyNmMjk3MzcnKSkNCmBgYA0KDQpgYGB7cn0NCiN3cml0ZSBjc3ZzIG9mIHRoZXNlIHJlc3VsdHMNCiNkb3ducmVndWxhdGVkDQp3cml0ZS5jc3YoaWh3LmdlbmVzLnJlcy5DRDEwM3ZzQ0Q0OWEuZG93biwnaWh3LmdlbmVzLnJlcy5DRDEwM3ZzQ0Q0OWEuZG93bi5jc3YnKQ0Kd3JpdGUuY3N2KGlody5nZW5lcy5yZXMuQ0QxMDN2c0ROLmRvd24sJ2lody5nZW5lcy5yZXMuQ0QxMDN2c0ROLmRvd24uY3N2JykNCndyaXRlLmNzdihpaHcuZ2VuZXMucmVzLkNEMTAzdnNEUC5kb3duLCdpaHcuZ2VuZXMucmVzLkNEMTAzdnNEUC5kb3duLmNzdicpDQp3cml0ZS5jc3YoaWh3LmdlbmVzLnJlcy5DRDQ5YXZzRFAuZG93biwnaWh3LmdlbmVzLnJlcy5DRDQ5YXZzRFAuZG93bi5jc3YnKQ0Kd3JpdGUuY3N2KGlody5nZW5lcy5yZXMuQ0Q0OWF2c0ROLmRvd24sJ2lody5nZW5lcy5yZXMuQ0Q0OWF2c0ROLmRvd24uY3N2JykNCndyaXRlLmNzdihpaHcuZ2VuZXMucmVzLkRQdnNETi5kb3duLCdpaHcuZ2VuZXMucmVzLkRQdnNETi5kb3duLmNzdicpDQoNCiN1cHJlZ3VsYXRlZA0Kd3JpdGUuY3N2KGlody5nZW5lcy5yZXMuQ0QxMDN2c0NENDlhLnVwLCdpaHcuZ2VuZXMucmVzLkNEMTAzdnNDRDQ5YS51cC5jc3YnKQ0Kd3JpdGUuY3N2KGlody5nZW5lcy5yZXMuQ0QxMDN2c0ROLnVwLCdpaHcuZ2VuZXMucmVzLkNEMTAzdnNETi51cC5jc3YnKQ0Kd3JpdGUuY3N2KGlody5nZW5lcy5yZXMuQ0QxMDN2c0RQLnVwLCdpaHcuZ2VuZXMucmVzLkNEMTAzdnNEUC51cC5jc3YnKQ0Kd3JpdGUuY3N2KGlody5nZW5lcy5yZXMuQ0Q0OWF2c0RQLnVwLCdpaHcuZ2VuZXMucmVzLkNENDlhdnNEUC51cC5jc3YnKQ0Kd3JpdGUuY3N2KGlody5nZW5lcy5yZXMuQ0Q0OWF2c0ROLnVwLCdpaHcuZ2VuZXMucmVzLkNENDlhdnNETi51cC5jc3YnKQ0Kd3JpdGUuY3N2KGlody5nZW5lcy5yZXMuRFB2c0ROLnVwLCdpaHcuZ2VuZXMucmVzLkRQdnNETi51cC5jc3YnKQ0KDQojYWxsIGdlbmVzDQp3cml0ZS5jc3YoaWh3LnJlcy5DRDEwM3ZzQ0Q0OWEuYWxsLCdpaHcucmVzLkNEMTAzdnNDRDQ5YS5hbGwuY3N2JykNCndyaXRlLmNzdihpaHcucmVzLkNEMTAzdnNETi5hbGwsJ2lody5yZXMuQ0QxMDN2c0ROLmFsbC5jc3YnKQ0Kd3JpdGUuY3N2KGlody5yZXMuQ0QxMDN2c0RQLmFsbCwnaWh3LnJlcy5DRDEwM3ZzRFAuYWxsLmNzdicpDQp3cml0ZS5jc3YoaWh3LnJlcy5DRDQ5YXZzRFAuYWxsLCdpaHcucmVzLkNENDlhdnNEUC5hbGwuY3N2JykNCndyaXRlLmNzdihpaHcucmVzLkNENDlhdnNETi5hbGwsJ2lody5yZXMuQ0Q0OWF2c0ROLmFsbC5jc3YnKQ0Kd3JpdGUuY3N2KGlody5yZXMuRFB2c0ROLmFsbCwnaWh3LnJlcy5EUHZzRE4uYWxsLmNzdicpDQoNCndyaXRlLmNzdihpaHcucmVzLkRQdnNETi5hbGwsJ2lody5yZXMuRFB2c0ROLmFsbC5zdGltLjQtMTQtMjEuY3N2JykNCmBgYA0KDQpgYGB7cn0NCiNwbG90IGxhYmVsZWQgdm9sY2FubyBwbG90cyBmb3IgYWxsIHNpeCBjb21wYXJpc29ucw0KbGlicmFyeShFbmhhbmNlZFZvbGNhbm8pDQp2aXJpZGlzcGFsNG90aGVyPC1jKCcjRkRFNzI1RkYnLCcjMzE2ODhFRkYnLCcjMzVCNzc5RkYnLCIjNDQwMTU0RkYiKQ0KRW5oYW5jZWRWb2xjYW5vKGlody5yZXMuQ0QxMDN2c0NENDlhLmFsbCwNCiAgICAgICAgICAgICAgICBsYWIgPSByb3duYW1lcyhpaHcucmVzLkNEMTAzdnNDRDQ5YS5hbGwpLCAgI2xhYmVscyBwb2ludHMgd2l0aCBnZW5lIG5hbWVzDQogICAgICAgICAgICAgICAgeCA9ICdsb2cyRm9sZENoYW5nZScsICAjWCBhbmQgWSBhcmUgYmFzZWQgb24gY29sdW1uIG5hbWVzIGZyb20gUmVzIGZpbGUNCiAgICAgICAgICAgICAgICB5ID0gJ3dlaWdodGVkX3B2YWx1ZScsDQogICAgICAgICAgICAgICAgeGxpbSA9IGMoLTgsIDgpLCAgI1BsYXkgYXJvdW5kIHdpdGggbGltaXRzIHRvIG1ha2Ugc3VyZSBhbGwgeW91ciBkYXRhIGZpdHMsIGl0IGRvZXNuJ3QgaW5kaWNhdGUgaWYgYSBwb2ludCBpcyBvZmYgc2NhbGUNCiAgICAgICAgICAgICAgICB4bGFiID0gYnF1b3RlKH5Mb2dbMl1+ICdGb2xkIENoYW5nZScpLCAgI1ggYW5kIFkgbWFudWFsIGxhYmVscw0KICAgICAgICAgICAgICAgIHlsYWIgPSBicXVvdGUofi1Mb2dbMTBdfndlaWdodGVkfml0YWxpYyhQKSksDQogICAgICAgICAgICAgICAgdGl0bGUgPSAnQ0QxMDMgdnMgQ0Q0OWEnLA0KICAgICAgICAgICAgICAgIEZDY3V0b2ZmID0gMS4wLA0KICAgICAgICAgICAgICAgIHBvaW50U2l6ZSA9IDMuMCwNCiAgICAgICAgICAgICAgICBsYWJTaXplID0gMy4wLA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlPScnLA0KICAgICAgICAgICAgICAgIGNvbD12aXJpZGlzcGFsNG90aGVyLA0KICAgICAgICAgICAgICAgIGNvbEFscGhhID0gMC4zLCkgI1NldHMgdHJhbnNwYXJlbmN5IG9mIHBvaW50cyBvbiB2b2xjYW5vIHBsb3QsIDE9MTAwJW9wYXF1ZSwgMD0xMDAlIHRyYW5zcGFyZW50DQoNCg0KDQoNCkVuaGFuY2VkVm9sY2FubyhpaHcucmVzLkNEMTAzdnNEUC5hbGwsDQogICAgICAgICAgICAgICAgbGFiID0gcm93bmFtZXMoaWh3LnJlcy5DRDEwM3ZzRFAuYWxsKSwgICNsYWJlbHMgcG9pbnRzIHdpdGggZ2VuZSBuYW1lcw0KICAgICAgICAgICAgICAgIHggPSAnbG9nMkZvbGRDaGFuZ2UnLCAgI1ggYW5kIFkgYXJlIGJhc2VkIG9uIGNvbHVtbiBuYW1lcyBmcm9tIFJlcyBmaWxlDQogICAgICAgICAgICAgICAgeSA9ICd3ZWlnaHRlZF9wdmFsdWUnLA0KICAgICAgICAgICAgICAgIHhsaW0gPSBjKC04LCA4KSwgICNQbGF5IGFyb3VuZCB3aXRoIGxpbWl0cyB0byBtYWtlIHN1cmUgYWxsIHlvdXIgZGF0YSBmaXRzLCBpdCBkb2Vzbid0IGluZGljYXRlIGlmIGEgcG9pbnQgaXMgb2ZmIHNjYWxlDQogICAgICAgICAgICAgICAgeGxhYiA9IGJxdW90ZSh+TG9nWzJdfiAnRm9sZCBDaGFuZ2UnKSwgICNYIGFuZCBZIG1hbnVhbCBsYWJlbHMNCiAgICAgICAgICAgICAgICB5bGFiID0gYnF1b3RlKH4tTG9nWzEwXX53ZWlnaHRlZH5pdGFsaWMoUCkpLA0KICAgICAgICAgICAgICAgIHRpdGxlID0gJ0NEMTAzIHZzIERQJywNCiAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEuMCwNCiAgICAgICAgICAgICAgICBwb2ludFNpemUgPSAzLjAsDQogICAgICAgICAgICAgICAgbGFiU2l6ZSA9IDMuMCwNCiAgICAgICAgICAgICAgICBzdWJ0aXRsZT0nJywNCiAgICAgICAgICAgICAgICBjb2w9dmlyaWRpc3BhbDRvdGhlciwNCiAgICAgICAgICAgICAgICBjb2xBbHBoYSA9IDAuMikgI1NldHMgdHJhbnNwYXJlbmN5IG9mIHBvaW50cyBvbiB2b2xjYW5vIHBsb3QsIDE9MTAwJW9wYXF1ZSwgMD0xMDAlIHRyYW5zcGFyZW50DQoNCg0KDQpFbmhhbmNlZFZvbGNhbm8oaWh3LnJlcy5DRDEwM3ZzRE4uYWxsLA0KICAgICAgICAgICAgICAgIGxhYiA9IHJvd25hbWVzKGlody5yZXMuQ0QxMDN2c0ROLmFsbCksICAjbGFiZWxzIHBvaW50cyB3aXRoIGdlbmUgbmFtZXMNCiAgICAgICAgICAgICAgICB4ID0gJ2xvZzJGb2xkQ2hhbmdlJywgICNYIGFuZCBZIGFyZSBiYXNlZCBvbiBjb2x1bW4gbmFtZXMgZnJvbSBSZXMgZmlsZQ0KICAgICAgICAgICAgICAgIHkgPSAnd2VpZ2h0ZWRfcHZhbHVlJywNCiAgICAgICAgICAgICAgICB4bGltID0gYygtOCwgOCksICAjUGxheSBhcm91bmQgd2l0aCBsaW1pdHMgdG8gbWFrZSBzdXJlIGFsbCB5b3VyIGRhdGEgZml0cywgaXQgZG9lc24ndCBpbmRpY2F0ZSBpZiBhIHBvaW50IGlzIG9mZiBzY2FsZQ0KICAgICAgICAgICAgICAgIHhsYWIgPSBicXVvdGUofkxvZ1syXX4gJ0ZvbGQgQ2hhbmdlJyksICAjWCBhbmQgWSBtYW51YWwgbGFiZWxzDQogICAgICAgICAgICAgICAgeWxhYiA9IGJxdW90ZSh+LUxvZ1sxMF1+d2VpZ2h0ZWR+aXRhbGljKFApKSwNCiAgICAgICAgICAgICAgICB0aXRsZSA9ICdDRDEwMyB2cyBETicsDQogICAgICAgICAgICAgICAgRkNjdXRvZmYgPSAxLjAsDQogICAgICAgICAgICAgICAgcG9pbnRTaXplID0gMy4wLA0KICAgICAgICAgICAgICAgIGxhYlNpemUgPSAzLjAsDQogICAgICAgICAgICAgICAgc3VidGl0bGU9JycsDQogICAgICAgICAgICAgICAgY29sPXZpcmlkaXNwYWw0b3RoZXIsDQogICAgICAgICAgICAgICAgY29sQWxwaGEgPSAwLjIpICNTZXRzIHRyYW5zcGFyZW5jeSBvZiBwb2ludHMgb24gdm9sY2FubyBwbG90LCAxPTEwMCVvcGFxdWUsIDA9MTAwJSB0cmFuc3BhcmVudA0KDQoNCg0KRW5oYW5jZWRWb2xjYW5vKGlody5yZXMuQ0Q0OWF2c0RQLmFsbCwNCiAgICAgICAgICAgICAgICBsYWIgPSByb3duYW1lcyhpaHcucmVzLkNENDlhdnNEUC5hbGwpLCAgI2xhYmVscyBwb2ludHMgd2l0aCBnZW5lIG5hbWVzDQogICAgICAgICAgICAgICAgeCA9ICdsb2cyRm9sZENoYW5nZScsICAjWCBhbmQgWSBhcmUgYmFzZWQgb24gY29sdW1uIG5hbWVzIGZyb20gUmVzIGZpbGUNCiAgICAgICAgICAgICAgICB5ID0gJ3dlaWdodGVkX3B2YWx1ZScsDQogICAgICAgICAgICAgICAgeGxpbSA9IGMoLTgsIDgpLCAgI1BsYXkgYXJvdW5kIHdpdGggbGltaXRzIHRvIG1ha2Ugc3VyZSBhbGwgeW91ciBkYXRhIGZpdHMsIGl0IGRvZXNuJ3QgaW5kaWNhdGUgaWYgYSBwb2ludCBpcyBvZmYgc2NhbGUNCiAgICAgICAgICAgICAgICB4bGFiID0gYnF1b3RlKH5Mb2dbMl1+ICdGb2xkIENoYW5nZScpLCAgI1ggYW5kIFkgbWFudWFsIGxhYmVscw0KICAgICAgICAgICAgICAgIHlsYWIgPSBicXVvdGUofi1Mb2dbMTBdfndlaWdodGVkfml0YWxpYyhQKSksDQogICAgICAgICAgICAgICAgdGl0bGUgPSAnQ0Q0OWEgdnMgRFAnLA0KICAgICAgICAgICAgICAgIEZDY3V0b2ZmID0gMS4wLA0KICAgICAgICAgICAgICAgIHBvaW50U2l6ZSA9IDMuMCwNCiAgICAgICAgICAgICAgICBsYWJTaXplID0gMy4wLA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlPScnLA0KICAgICAgICAgICAgICAgIGNvbD12aXJpZGlzcGFsNG90aGVyLA0KICAgICAgICAgICAgICAgIGNvbEFscGhhID0gMC4yKSAjU2V0cyB0cmFuc3BhcmVuY3kgb2YgcG9pbnRzIG9uIHZvbGNhbm8gcGxvdCwgMT0xMDAlb3BhcXVlLCAwPTEwMCUgdHJhbnNwYXJlbnQNCg0KDQoNCg0KRW5oYW5jZWRWb2xjYW5vKGlody5yZXMuQ0Q0OWF2c0ROLmFsbCwNCiAgICAgICAgICAgICAgICBsYWIgPSByb3duYW1lcyhpaHcucmVzLkNENDlhdnNETi5hbGwpLCAgI2xhYmVscyBwb2ludHMgd2l0aCBnZW5lIG5hbWVzDQogICAgICAgICAgICAgICAgeCA9ICdsb2cyRm9sZENoYW5nZScsICAjWCBhbmQgWSBhcmUgYmFzZWQgb24gY29sdW1uIG5hbWVzIGZyb20gUmVzIGZpbGUNCiAgICAgICAgICAgICAgICB5ID0gJ3dlaWdodGVkX3B2YWx1ZScsDQogICAgICAgICAgICAgICAgeGxpbSA9IGMoLTgsIDgpLCAgI1BsYXkgYXJvdW5kIHdpdGggbGltaXRzIHRvIG1ha2Ugc3VyZSBhbGwgeW91ciBkYXRhIGZpdHMsIGl0IGRvZXNuJ3QgaW5kaWNhdGUgaWYgYSBwb2ludCBpcyBvZmYgc2NhbGUNCiAgICAgICAgICAgICAgICB4bGFiID0gYnF1b3RlKH5Mb2dbMl1+ICdGb2xkIENoYW5nZScpLCAgI1ggYW5kIFkgbWFudWFsIGxhYmVscw0KICAgICAgICAgICAgICAgIHlsYWIgPSBicXVvdGUofi1Mb2dbMTBdfndlaWdodGVkfml0YWxpYyhQKSksDQogICAgICAgICAgICAgICAgdGl0bGUgPSAnQ0Q0OWEgdnMgRE4nLA0KICAgICAgICAgICAgICAgIEZDY3V0b2ZmID0gMS4wLA0KICAgICAgICAgICAgICAgIHBvaW50U2l6ZSA9IDMuMCwNCiAgICAgICAgICAgICAgICBsYWJTaXplID0gMy4wLA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlPScnLA0KICAgICAgICAgICAgICAgIGNvbD12aXJpZGlzcGFsNG90aGVyLA0KICAgICAgICAgICAgICAgIGNvbEFscGhhID0gMC4yKSAjU2V0cyB0cmFuc3BhcmVuY3kgb2YgcG9pbnRzIG9uIHZvbGNhbm8gcGxvdCwgMT0xMDAlb3BhcXVlLCAwPTEwMCUgdHJhbnNwYXJlbnQNCg0KDQoNCkVuaGFuY2VkVm9sY2FubyhpaHcucmVzLkRQdnNETi5hbGwsDQogICAgICAgICAgICAgICAgbGFiID0gcm93bmFtZXMoaWh3LnJlcy5EUHZzRE4uYWxsKSwgICNsYWJlbHMgcG9pbnRzIHdpdGggZ2VuZSBuYW1lcw0KICAgICAgICAgICAgICAgIHggPSAnbG9nMkZvbGRDaGFuZ2UnLCAgI1ggYW5kIFkgYXJlIGJhc2VkIG9uIGNvbHVtbiBuYW1lcyBmcm9tIFJlcyBmaWxlDQogICAgICAgICAgICAgICAgeSA9ICd3ZWlnaHRlZF9wdmFsdWUnLA0KICAgICAgICAgICAgICAgIHhsaW0gPSBjKC04LCA4KSwgICNQbGF5IGFyb3VuZCB3aXRoIGxpbWl0cyB0byBtYWtlIHN1cmUgYWxsIHlvdXIgZGF0YSBmaXRzLCBpdCBkb2Vzbid0IGluZGljYXRlIGlmIGEgcG9pbnQgaXMgb2ZmIHNjYWxlDQogICAgICAgICAgICAgICAgeGxhYiA9IGJxdW90ZSh+TG9nWzJdfiAnRm9sZCBDaGFuZ2UnKSwgICNYIGFuZCBZIG1hbnVhbCBsYWJlbHMNCiAgICAgICAgICAgICAgICB5bGFiID0gYnF1b3RlKH4tTG9nWzEwXX53ZWlnaHRlZH5pdGFsaWMoUCkpLA0KICAgICAgICAgICAgICAgIHRpdGxlID0gJ0RQIHZzIEROJywNCiAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEuMCwNCiAgICAgICAgICAgICAgICBwb2ludFNpemUgPSAzLjAsDQogICAgICAgICAgICAgICAgbGFiU2l6ZSA9IDMuMCwNCiAgICAgICAgICAgICAgICBzdWJ0aXRsZT0nJywNCiAgICAgICAgICAgICAgICBjb2w9dmlyaWRpc3BhbDRvdGhlciwNCiAgICAgICAgICAgICAgICBjb2xBbHBoYSA9IDAuMikgI1NldHMgdHJhbnNwYXJlbmN5IG9mIHBvaW50cyBvbiB2b2xjYW5vIHBsb3QsIDE9MTAwJW9wYXF1ZSwgMD0xMDAlIHRyYW5zcGFyZW50DQoNCmBgYA0KDQpgYGB7cn0NCiNwbG90IGEgdmFyaWV0eSBvZiBvdGhlciB2b2xjYW5vIHBsb3RzDQpsaWJyYXJ5KEVuaGFuY2VkVm9sY2FubykNCnZpcmlkaXNwYWw0b3RoZXI8LWMoJyNGREU3MjVGRicsJyMzMTY4OEVGRicsJyMzNUI3NzlGRicsIiM0NDAxNTRGRiIpDQpzZXRvbmU8LWlody5yZXMuRFB2c0ROLmFsbFtjKCdJZm5nJywnVG5mJywnSWwyJywnQ2NsMScsJ0NzZjInLCdQcmYnLCdHem1hJywnRmFzbCcpLF0NCkVuaGFuY2VkVm9sY2FubyhzZXRvbmUsDQogICAgICAgICAgICAgICAgbGFiID0gcm93bmFtZXMoc2V0b25lKSwgICNsYWJlbHMgcG9pbnRzIHdpdGggZ2VuZSBuYW1lcw0KICAgICAgICAgICAgICAgIHggPSAnbG9nMkZvbGRDaGFuZ2UnLCAgI1ggYW5kIFkgYXJlIGJhc2VkIG9uIGNvbHVtbiBuYW1lcyBmcm9tIFJlcyBmaWxlDQogICAgICAgICAgICAgICAgeSA9ICd3ZWlnaHRlZF9wdmFsdWUnLA0KICAgICAgICAgICAgICAgIHhsaW0gPSBjKC04LCA4KSwgICNQbGF5IGFyb3VuZCB3aXRoIGxpbWl0cyB0byBtYWtlIHN1cmUgYWxsIHlvdXIgZGF0YSBmaXRzLCBpdCBkb2Vzbid0IGluZGljYXRlIGlmIGEgcG9pbnQgaXMgb2ZmIHNjYWxlDQogICAgICAgICAgICAgICAgeWxpbSA9IGMoMCwgMzAwKSwNCiAgICAgICAgICAgICAgICAgeGxhYiA9IGJxdW90ZSh+TG9nWzJdfiAnRm9sZCBDaGFuZ2UnKSwgICNYIGFuZCBZIG1hbnVhbCBsYWJlbHMNCiAgICAgICAgICAgICAgICB5bGFiID0gYnF1b3RlKH4tTG9nWzEwXX53ZWlnaHRlZH5pdGFsaWMoUCkpLA0KICAgICAgICAgICAgICAgIHRpdGxlID0gJ0RQIHZzIEROJywNCiAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEuMCwNCiAgICAgICAgICAgICAgICBwb2ludFNpemUgPSAzLjAsDQogICAgICAgICAgICAgICAgbGFiU2l6ZSA9IDMuMCwNCiAgICAgICAgICAgICAgICBzdWJ0aXRsZT0nJywNCiAgICAgICAgICAgICAgICBjb2w9dmlyaWRpc3BhbDRvdGhlciwNCiAgICAgICAgICAgICAgICBjb2xBbHBoYSA9IDAuOCwgI1NldHMgdHJhbnNwYXJlbmN5IG9mIHBvaW50cyBvbiB2b2xjYW5vIHBsb3QsIDE9MTAwJW9wYXF1ZSwgMD0xMDAlIHRyYW5zcGFyZW50DQogICAgICAgICAgICAgICAgc2VsZWN0TGFiID0gYygnSWZuZycsJ1RuZicsJ0lsMicsJ0NjbDEnLCdDc2YyJywnUHJmJywnR3ptYScsJ0Zhc2wnKSkgDQoNCkVuaGFuY2VkVm9sY2FubyhpaHcucmVzLkRQdnNETi5hbGwsDQogICAgICAgICAgICAgICAgbGFiID0gcm93bmFtZXMoaWh3LnJlcy5EUHZzRE4uYWxsKSwgICNsYWJlbHMgcG9pbnRzIHdpdGggZ2VuZSBuYW1lcw0KICAgICAgICAgICAgICAgIHggPSAnbG9nMkZvbGRDaGFuZ2UnLCAgI1ggYW5kIFkgYXJlIGJhc2VkIG9uIGNvbHVtbiBuYW1lcyBmcm9tIFJlcyBmaWxlDQogICAgICAgICAgICAgICAgeSA9ICd3ZWlnaHRlZF9wdmFsdWUnLA0KICAgICAgICAgICAgICAgIHhsaW0gPSBjKC04LCA4KSwgICNQbGF5IGFyb3VuZCB3aXRoIGxpbWl0cyB0byBtYWtlIHN1cmUgYWxsIHlvdXIgZGF0YSBmaXRzLCBpdCBkb2Vzbid0IGluZGljYXRlIGlmIGEgcG9pbnQgaXMgb2ZmIHNjYWxlDQogICAgICAgICAgICAgICAgeWxpbSA9IGMoMCwgMzAwKSwNCiAgICAgICAgICAgICAgICB4bGFiID0gYnF1b3RlKH5Mb2dbMl1+ICdGb2xkIENoYW5nZScpLCAgI1ggYW5kIFkgbWFudWFsIGxhYmVscw0KICAgICAgICAgICAgICAgIHlsYWIgPSBicXVvdGUofi1Mb2dbMTBdfndlaWdodGVkfml0YWxpYyhQKSksDQogICAgICAgICAgICAgICAgdGl0bGUgPSAnRFAgdnMgRE4nLA0KICAgICAgICAgICAgICAgIEZDY3V0b2ZmID0gMS4wLA0KICAgICAgICAgICAgICAgIHBvaW50U2l6ZSA9IDMuMCwNCiAgICAgICAgICAgICAgICBsYWJTaXplID0gMy4wLA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlPScnLA0KICAgICAgICAgICAgICAgIGNvbD1jKCcjZDNkM2QzJywnI2QzZDNkMycsJyNkM2QzZDMnLCcjZDNkM2QzJyksDQogICAgICAgICAgICAgICAgc2VsZWN0TGFiID0gYygnJyksDQogICAgICAgICAgICAgICAgY29sQWxwaGEgPSAwLjEsKSAjU2V0cyB0cmFuc3BhcmVuY3kgb2YgcG9pbnRzIG9uIHZvbGNhbm8gcGxvdCwgMT0xMDAlb3BhcXVlLCAwPTEwMCUgdHJhbnNwYXJlbnQpIA0KDQoNCg0KRW5oYW5jZWRWb2xjYW5vKGlody5yZXMuRFB2c0ROLmFsbCwNCiAgICAgICAgICAgICAgICBsYWIgPSByb3duYW1lcyhpaHcucmVzLkNEMTAzdnNDRDQ5YS5hbGwpLCAgI2xhYmVscyBwb2ludHMgd2l0aCBnZW5lIG5hbWVzDQogICAgICAgICAgICAgICAgeCA9ICdsb2cyRm9sZENoYW5nZScsICAjWCBhbmQgWSBhcmUgYmFzZWQgb24gY29sdW1uIG5hbWVzIGZyb20gUmVzIGZpbGUNCiAgICAgICAgICAgICAgICB5ID0gJ3dlaWdodGVkX3B2YWx1ZScsDQogICAgICAgICAgICAgICAgeGxpbSA9IGMoLTgsIDgpLCAgI1BsYXkgYXJvdW5kIHdpdGggbGltaXRzIHRvIG1ha2Ugc3VyZSBhbGwgeW91ciBkYXRhIGZpdHMsIGl0IGRvZXNuJ3QgaW5kaWNhdGUgaWYgYSBwb2ludCBpcyBvZmYgc2NhbGUNCiAgICAgICAgICAgICAgICB4bGFiID0gYnF1b3RlKH5Mb2dbMl1+ICdGb2xkIENoYW5nZScpLCAgI1ggYW5kIFkgbWFudWFsIGxhYmVscw0KICAgICAgICAgICAgICAgIHlsYWIgPSBicXVvdGUofi1Mb2dbMTBdfndlaWdodGVkfml0YWxpYyhQKSksDQogICAgICAgICAgICAgICAgdGl0bGUgPSAnRFAgdnMgRE4nLA0KICAgICAgICAgICAgICAgIEZDY3V0b2ZmID0gMS4wLA0KICAgICAgICAgICAgICAgIHBvaW50U2l6ZSA9IDMuMCwNCiAgICAgICAgICAgICAgICBsYWJTaXplID0gMy4wLA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlPScnLA0KICAgICAgICAgICAgICAgIGNvbD12aXJpZGlzcGFsNG90aGVyLA0KICAgICAgICAgICAgICAgIGNvbEFscGhhID0gMC4zLCAjU2V0cyB0cmFuc3BhcmVuY3kgb2YgcG9pbnRzIG9uIHZvbGNhbm8gcGxvdCwgMT0xMDAlb3BhcXVlLCAwPTEwMCUgdHJhbnNwYXJlbnQNCiAgICAgICAgICAgICAgICBzZWxlY3RMYWIgPSBjKCdJZm5nJywnVG5mJywnSWwyJywnQ2NsMScsJ0NzZjInLCdQcmYnLCdHem1hJywnRmFzbCcsIkNzZjEiLCAnSWwxMCcsJ0NjbDMnLCdJbDIxJywnSWwxN2EnLCdDeGNsOScsJ0d6bWInLCdHem1jJywnVG5mc2YxMCcpKQ0KDQpgYGANCg0KDQpgYGB7cn0NCiNFbnJpY2hyDQojaHR0cHM6Ly93d3cuYmlvc3RhcnMub3JnL3AvMzQzMTk2Lw0KbGlicmFyeShlbnJpY2hSKQ0KbGlzdEVucmljaHJEYnMoKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KdGhlbWVfc2V0KHRoZW1lX2J3KCkpICANCmRicyA8LSBsaXN0RW5yaWNockRicygpDQphbGxkYnMgPC0gbGlzdEVucmljaHJEYnMoKQ0KZGJzIDwtIGMoICJHT19CaW9sb2dpY2FsX1Byb2Nlc3NfMjAxOCIgLA0KICAgICAgICAgICJLRUdHXzIwMTlfTW91c2UiLCANCiAgICAgICAgICAiVFJSVVNUX1RyYW5zY3JpcHRpb25fRmFjdG9yc18yMDE5IiwNCiAgICAgICAgICAnVFJBTlNGQUNfYW5kX0pBU1BBUl9QV01zJywNCiAgICAgICAgICAnVHJhbnNjcmlwdGlvbl9GYWN0b3JfUFBJcycsJ1JlYWN0b21lXzIwMTYnKQ0KZGIgPC0gZGJzDQp2aXJpZGlzcGFsMiA8LSB2aXJpZGlzKG49MikNCg0KDQojQ0QxMDN2c0NENDlhDQoNCmxpc3RfdXAgPC0gYyh1cGdlbmVzLmlody5yZXMuQ0QxMDN2c0NENDlhKQ0KbGlzdF9kb3duIDwtIGMoZG93bmdlbmVzLmlody5yZXMuQ0QxMDN2c0NENDlhKQ0KZXVwIDwtIGVucmljaHIobGlzdF91cCwgZGJzKQ0KZWRvd24gPC0gZW5yaWNocihsaXN0X2Rvd24sIGRicykNCg0KdXAgPC0gZXVwJEtFR0dfMjAxOV9Nb3VzZQ0KZG93biA8LSBlZG93biRLRUdHXzIwMTlfTW91c2UNCiAgICAgICAgI2tlZ2cNCnVwJHR5cGUgPC0gInVwIg0KZG93biR0eXBlIDwtICJkb3duIg0KdXAgPC0gdXBbdXAkQWRqdXN0ZWQuUC52YWx1ZTwuMDUsXQ0KdXAgPC0gdXBbb3JkZXIodXAkQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24gPC0gZG93bltkb3duJEFkanVzdGVkLlAudmFsdWU8MC4wNSxdDQpkb3duIDwtIGRvd25bb3JkZXIoZG93biRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biRDb21iaW5lZC5TY29yZSA8LSAoLTEpICogZG93biRDb21iaW5lZC5TY29yZQ0KZ29zIDwtIHJiaW5kKGRvd24sdXApDQpnb3MgPC0gbmEub21pdChnb3MpICMgRGl2ZXJnaW5nIEJhcmNoYXJ0cw0KZ2dwbG90KGdvcywgYWVzKHg9cmVvcmRlcihUZXJtLENvbWJpbmVkLlNjb3JlKSwgeT1Db21iaW5lZC5TY29yZSAsIGxhYmVsPUNvbWJpbmVkLlNjb3JlKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBhZXMoZmlsbD1BZGp1c3RlZC5QLnZhbHVlKSwgd2lkdGg9LjUscG9zaXRpb249ImRvZGdlIikgICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyANCg0KDQogIGxhYnMoc3VidGl0bGU9IkNvbWJpbmVkIHNjb3JlcyBmcm9tIEtlZ2cgcGF0aHdheXMiLCANCiAgICAgICB0aXRsZT0gIkNEMTAzIHZzIENENDlhIikgKyANCiAgY29vcmRfZmxpcCgpDQogICAgICAgICNHTw0KdXAgPC0gZXVwJEdPX0Jpb2xvZ2ljYWxfUHJvY2Vzc18yMDE4DQpkb3duIDwtIGVkb3duJEdPX0Jpb2xvZ2ljYWxfUHJvY2Vzc18yMDE4DQoNCnVwJHR5cGUgPC0gInVwIg0KZG93biR0eXBlIDwtICJkb3duIg0KdXAgPC0gdXBbdXAkQWRqdXN0ZWQuUC52YWx1ZTwuMDUsXQ0KdXAgPC0gdXBbb3JkZXIodXAkQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24gPC0gZG93bltkb3duJEFkanVzdGVkLlAudmFsdWU8MC4wNSxdDQpkb3duIDwtIGRvd25bb3JkZXIoZG93biRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biRDb21iaW5lZC5TY29yZSA8LSAoLTEpICogZG93biRDb21iaW5lZC5TY29yZQ0KZ29zIDwtIHJiaW5kKGRvd24sdXApDQpnb3MgPC0gbmEub21pdChnb3MpICMgRGl2ZXJnaW5nIEJhcmNoYXJ0cw0KZ2dwbG90KGdvcywgYWVzKHg9cmVvcmRlcihUZXJtLENvbWJpbmVkLlNjb3JlKSwgeT1Db21iaW5lZC5TY29yZSAsIGxhYmVsPUNvbWJpbmVkLlNjb3JlKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBhZXMoZmlsbD1BZGp1c3RlZC5QLnZhbHVlKSwgd2lkdGg9LjUscG9zaXRpb249ImRvZGdlIikgICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyANCiAgbGFicyhzdWJ0aXRsZT0iQ29tYmluZWQgc2NvcmVzIGZyb20gR08gcGF0aHdheXMiLCANCiAgICAgICB0aXRsZT0gIkNEMTAzIHZzIENENDlhIikgKyANCiAgY29vcmRfZmxpcCgpDQogICAgICAgICAgDQoNCiAgICAgICAgI1RSUlVTVA0KdXAgPC0gZXVwJFRSUlVTVF9UcmFuc2NyaXB0aW9uX0ZhY3RvcnNfMjAxOQ0KZG93biA8LSBlZG93biRUUlJVU1RfVHJhbnNjcmlwdGlvbl9GYWN0b3JzXzIwMTkNCnVwJHR5cGUgPC0gInVwIg0KZG93biR0eXBlIDwtICJkb3duIg0KdXAgPC0gdXBbdXAkQWRqdXN0ZWQuUC52YWx1ZTwuMDUsXQ0KdXAgPC0gdXBbb3JkZXIodXAkQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24gPC0gZG93bltkb3duJEFkanVzdGVkLlAudmFsdWU8MC4wNSxdDQpkb3duIDwtIGRvd25bb3JkZXIoZG93biRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biRDb21iaW5lZC5TY29yZSA8LSAoLTEpICogZG93biRDb21iaW5lZC5TY29yZQ0KZ29zIDwtIHJiaW5kKGRvd24sdXApDQpnb3MgPC0gbmEub21pdChnb3MpICMgRGl2ZXJnaW5nIEJhcmNoYXJ0cw0KZ2dwbG90KGdvcywgYWVzKHg9cmVvcmRlcihUZXJtLENvbWJpbmVkLlNjb3JlKSwgeT1Db21iaW5lZC5TY29yZSAsIGxhYmVsPUNvbWJpbmVkLlNjb3JlKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBhZXMoZmlsbD1BZGp1c3RlZC5QLnZhbHVlKSwgd2lkdGg9LjUscG9zaXRpb249ImRvZGdlIikgICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyANCg0KDQogIGxhYnMoc3VidGl0bGU9IkNvbWJpbmVkIHNjb3JlcyBmcm9tIFRSUlVTVCBwYXRod2F5cyIsIA0KICAgICAgIHRpdGxlPSAiQ0QxMDMgdnMgQ0Q0OWEiKSArIA0KICBjb29yZF9mbGlwKCkNCg0KICAgICAgICAjVFJBTlNGQUNfYW5kX0pBU1BBUl9QV01zDQp1cCA8LSBldXAkVFJBTlNGQUNfYW5kX0pBU1BBUl9QV01zDQpkb3duIDwtIGVkb3duJFRSQU5TRkFDX2FuZF9KQVNQQVJfUFdNcw0KdXAkdHlwZSA8LSAidXAiDQpkb3duJHR5cGUgPC0gImRvd24iDQp1cCA8LSB1cFt1cCRBZGp1c3RlZC5QLnZhbHVlPC4wNSxdDQp1cCA8LSB1cFtvcmRlcih1cCRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biA8LSBkb3duW2Rvd24kQWRqdXN0ZWQuUC52YWx1ZTwwLjA1LF0NCmRvd24gPC0gZG93bltvcmRlcihkb3duJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duJENvbWJpbmVkLlNjb3JlIDwtICgtMSkgKiBkb3duJENvbWJpbmVkLlNjb3JlDQpnb3MgPC0gcmJpbmQoZG93bix1cCkNCmdvcyA8LSBuYS5vbWl0KGdvcykgIyBEaXZlcmdpbmcgQmFyY2hhcnRzDQpnZ3Bsb3QoZ29zLCBhZXMoeD1yZW9yZGVyKFRlcm0sQ29tYmluZWQuU2NvcmUpLCB5PUNvbWJpbmVkLlNjb3JlICwgbGFiZWw9Q29tYmluZWQuU2NvcmUpKSArIA0KICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsIGFlcyhmaWxsPUFkanVzdGVkLlAudmFsdWUpLCB3aWR0aD0uNSxwb3NpdGlvbj0iZG9kZ2UiKSAgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIA0KDQoNCiAgbGFicyhzdWJ0aXRsZT0iQ29tYmluZWQgc2NvcmVzIGZyb20gVFJBTlNGQUNfYW5kX0pBU1BBUl9QV01zIHBhdGh3YXlzIiwgDQogICAgICAgdGl0bGU9ICJDRDEwMyB2cyBDRDQ5YSIpICsgDQogIGNvb3JkX2ZsaXAoKQ0KDQogICAgICAgICNUcmFuc2NyaXB0aW9uX0ZhY3Rvcl9QUElzDQp1cCA8LSBldXAkVHJhbnNjcmlwdGlvbl9GYWN0b3JfUFBJcw0KZG93biA8LSBlZG93biRUcmFuc2NyaXB0aW9uX0ZhY3Rvcl9QUElzDQp1cCR0eXBlIDwtICJ1cCINCmRvd24kdHlwZSA8LSAiZG93biINCnVwIDwtIHVwW3VwJEFkanVzdGVkLlAudmFsdWU8LjA1LF0NCnVwIDwtIHVwW29yZGVyKHVwJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duIDwtIGRvd25bZG93biRBZGp1c3RlZC5QLnZhbHVlPDAuMDUsXQ0KZG93biA8LSBkb3duW29yZGVyKGRvd24kQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24kQ29tYmluZWQuU2NvcmUgPC0gKC0xKSAqIGRvd24kQ29tYmluZWQuU2NvcmUNCmdvcyA8LSByYmluZChkb3duLHVwKQ0KZ29zIDwtIG5hLm9taXQoZ29zKSAjIERpdmVyZ2luZyBCYXJjaGFydHMNCmdncGxvdChnb3MsIGFlcyh4PXJlb3JkZXIoVGVybSxDb21iaW5lZC5TY29yZSksIHk9Q29tYmluZWQuU2NvcmUgLCBsYWJlbD1Db21iaW5lZC5TY29yZSkpICsgDQogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JywgYWVzKGZpbGw9QWRqdXN0ZWQuUC52YWx1ZSksIHdpZHRoPS41LHBvc2l0aW9uPSJkb2RnZSIpICArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsgDQoNCg0KICBsYWJzKHN1YnRpdGxlPSJDb21iaW5lZCBzY29yZXMgZnJvbSBUcmFuc2NyaXB0aW9uX0ZhY3Rvcl9QUElzIHBhdGh3YXlzIiwgDQogICAgICAgdGl0bGU9ICJDRDEwMyB2cyBDRDQ5YSIpICsgDQogIGNvb3JkX2ZsaXAoKQ0KDQoNCg0KDQojQ0QxMDN2c0RQDQoNCmxpc3RfdXAgPC0gYyh1cGdlbmVzLmlody5yZXMuQ0QxMDN2c0RQKQ0KbGlzdF9kb3duIDwtIGMoZG93bmdlbmVzLmlody5yZXMuQ0QxMDN2c0RQKQ0KDQoNCmV1cCA8LSBlbnJpY2hyKGxpc3RfdXAsIGRicykNCmVkb3duIDwtIGVucmljaHIobGlzdF9kb3duLCBkYnMpDQoNCnVwIDwtIGV1cCRLRUdHXzIwMTlfTW91c2UNCmRvd24gPC0gZWRvd24kS0VHR18yMDE5X01vdXNlDQogICAgICAgICNrZWdnDQp1cCR0eXBlIDwtICJ1cCINCmRvd24kdHlwZSA8LSAiZG93biINCnVwIDwtIHVwW3VwJEFkanVzdGVkLlAudmFsdWU8LjA1LF0NCnVwIDwtIHVwW29yZGVyKHVwJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duIDwtIGRvd25bZG93biRBZGp1c3RlZC5QLnZhbHVlPDAuMDUsXQ0KZG93biA8LSBkb3duW29yZGVyKGRvd24kQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24kQ29tYmluZWQuU2NvcmUgPC0gKC0xKSAqIGRvd24kQ29tYmluZWQuU2NvcmUNCmdvcyA8LSByYmluZChkb3duLHVwKQ0KZ29zIDwtIG5hLm9taXQoZ29zKSAjIERpdmVyZ2luZyBCYXJjaGFydHMNCmdncGxvdChnb3MsIGFlcyh4PXJlb3JkZXIoVGVybSxDb21iaW5lZC5TY29yZSksIHk9Q29tYmluZWQuU2NvcmUgLCBsYWJlbD1Db21iaW5lZC5TY29yZSkpICsgDQogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JywgYWVzKGZpbGw9QWRqdXN0ZWQuUC52YWx1ZSksIHdpZHRoPS41LHBvc2l0aW9uPSJkb2RnZSIpICArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsgDQoNCg0KICBsYWJzKHN1YnRpdGxlPSJDb21iaW5lZCBzY29yZXMgZnJvbSBLZWdnIHBhdGh3YXlzIiwgDQogICAgICAgdGl0bGU9ICJDRDEwMyB2cyBEUCIpICsgDQogIGNvb3JkX2ZsaXAoKQ0KICAgICAgICAjR08NCnVwIDwtIGV1cCRHT19CaW9sb2dpY2FsX1Byb2Nlc3NfMjAxOA0KZG93biA8LSBlZG93biRHT19CaW9sb2dpY2FsX1Byb2Nlc3NfMjAxOA0KDQp1cCR0eXBlIDwtICJ1cCINCmRvd24kdHlwZSA8LSAiZG93biINCnVwIDwtIHVwW3VwJEFkanVzdGVkLlAudmFsdWU8LjA1LF0NCnVwIDwtIHVwW29yZGVyKHVwJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duIDwtIGRvd25bZG93biRBZGp1c3RlZC5QLnZhbHVlPDAuMDUsXQ0KZG93biA8LSBkb3duW29yZGVyKGRvd24kQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24kQ29tYmluZWQuU2NvcmUgPC0gKC0xKSAqIGRvd24kQ29tYmluZWQuU2NvcmUNCmdvcyA8LSByYmluZChkb3duLHVwKQ0KZ29zIDwtIG5hLm9taXQoZ29zKSAjIERpdmVyZ2luZyBCYXJjaGFydHMNCmdncGxvdChnb3MsIGFlcyh4PXJlb3JkZXIoVGVybSxDb21iaW5lZC5TY29yZSksIHk9Q29tYmluZWQuU2NvcmUgLCBsYWJlbD1Db21iaW5lZC5TY29yZSkpICsgDQogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JywgYWVzKGZpbGw9QWRqdXN0ZWQuUC52YWx1ZSksIHdpZHRoPS41LHBvc2l0aW9uPSJkb2RnZSIpICArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsgDQoNCg0KICBsYWJzKHN1YnRpdGxlPSJDb21iaW5lZCBzY29yZXMgZnJvbSBHTyBwYXRod2F5cyIsIA0KICAgICAgIHRpdGxlPSAiQ0QxMDMgdnMgRFAiKSArIA0KICBjb29yZF9mbGlwKCkNCg0KDQojVFJSVVNUDQojVEhJUyBIQVMgTk8gVVAgT1IgRE9XTiBSRUdVTEFURUQgUEFUSFdBWVMgDQp1cCA8LSBldXAkVFJSVVNUX1RyYW5zY3JpcHRpb25fRmFjdG9yc18yMDE5DQpkb3duIDwtIGVkb3duJFRSUlVTVF9UcmFuc2NyaXB0aW9uX0ZhY3RvcnNfMjAxOQ0KdXAkdHlwZSA8LSAidXAiDQpkb3duJHR5cGUgPC0gImRvd24iDQp1cCA8LSB1cFt1cCRBZGp1c3RlZC5QLnZhbHVlPC4wNSxdDQp1cCA8LSB1cFtvcmRlcih1cCRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biA8LSBkb3duW2Rvd24kQWRqdXN0ZWQuUC52YWx1ZTwwLjA1LF0NCmRvd24gPC0gZG93bltvcmRlcihkb3duJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duJENvbWJpbmVkLlNjb3JlIDwtICgtMSkgKiBkb3duJENvbWJpbmVkLlNjb3JlDQpnb3MgPC0gcmJpbmQoZG93bix1cCkNCmdvcyA8LSBuYS5vbWl0KGdvcykgIyBEaXZlcmdpbmcgQmFyY2hhcnRzDQpnZ3Bsb3QoZ29zLCBhZXMoeD1yZW9yZGVyKFRlcm0sQ29tYmluZWQuU2NvcmUpLCB5PUNvbWJpbmVkLlNjb3JlICwgbGFiZWw9Q29tYmluZWQuU2NvcmUpKSArIA0KICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsIGFlcyhmaWxsPUFkanVzdGVkLlAudmFsdWUpLCB3aWR0aD0uNSxwb3NpdGlvbj0iZG9kZ2UiKSAgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIA0KDQoNCiAgbGFicyhzdWJ0aXRsZT0iQ29tYmluZWQgc2NvcmVzIGZyb20gVFJSVVNUIHBhdGh3YXlzIiwgDQogICAgICAgdGl0bGU9ICJDRDEwMyB2cyBEUCIpICsgDQogIGNvb3JkX2ZsaXAoKQ0KDQoNCiAgICAgICAgI1RSQU5TRkFDX2FuZF9KQVNQQVJfUFdNcw0KdXAgPC0gZXVwJFRSQU5TRkFDX2FuZF9KQVNQQVJfUFdNcw0KZG93biA8LSBlZG93biRUUkFOU0ZBQ19hbmRfSkFTUEFSX1BXTXMNCnVwJHR5cGUgPC0gInVwIg0KZG93biR0eXBlIDwtICJkb3duIg0KdXAgPC0gdXBbdXAkQWRqdXN0ZWQuUC52YWx1ZTwuMDUsXQ0KdXAgPC0gdXBbb3JkZXIodXAkQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24gPC0gZG93bltkb3duJEFkanVzdGVkLlAudmFsdWU8MC4wNSxdDQpkb3duIDwtIGRvd25bb3JkZXIoZG93biRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biRDb21iaW5lZC5TY29yZSA8LSAoLTEpICogZG93biRDb21iaW5lZC5TY29yZQ0KZ29zIDwtIHJiaW5kKGRvd24sdXApDQpnb3MgPC0gbmEub21pdChnb3MpICMgRGl2ZXJnaW5nIEJhcmNoYXJ0cw0KZ2dwbG90KGdvcywgYWVzKHg9cmVvcmRlcihUZXJtLENvbWJpbmVkLlNjb3JlKSwgeT1Db21iaW5lZC5TY29yZSAsIGxhYmVsPUNvbWJpbmVkLlNjb3JlKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBhZXMoZmlsbD1BZGp1c3RlZC5QLnZhbHVlKSwgd2lkdGg9LjUscG9zaXRpb249ImRvZGdlIikgICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyANCg0KDQogIGxhYnMoc3VidGl0bGU9IkNvbWJpbmVkIHNjb3JlcyBmcm9tIFRSQU5TRkFDX2FuZF9KQVNQQVJfUFdNcyBwYXRod2F5cyIsIA0KICAgICAgIHRpdGxlPSAiQ0QxMDMgdnMgRFAiKSArIA0KICBjb29yZF9mbGlwKCkNCg0KICAgICAgICAjVHJhbnNjcmlwdGlvbl9GYWN0b3JfUFBJcw0KdXAgPC0gZXVwJFRyYW5zY3JpcHRpb25fRmFjdG9yX1BQSXMNCmRvd24gPC0gZWRvd24kVHJhbnNjcmlwdGlvbl9GYWN0b3JfUFBJcw0KdXAkdHlwZSA8LSAidXAiDQpkb3duJHR5cGUgPC0gImRvd24iDQp1cCA8LSB1cFt1cCRBZGp1c3RlZC5QLnZhbHVlPC4wNSxdDQp1cCA8LSB1cFtvcmRlcih1cCRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biA8LSBkb3duW2Rvd24kQWRqdXN0ZWQuUC52YWx1ZTwwLjA1LF0NCmRvd24gPC0gZG93bltvcmRlcihkb3duJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duJENvbWJpbmVkLlNjb3JlIDwtICgtMSkgKiBkb3duJENvbWJpbmVkLlNjb3JlDQpnb3MgPC0gcmJpbmQoZG93bix1cCkNCmdvcyA8LSBuYS5vbWl0KGdvcykgIyBEaXZlcmdpbmcgQmFyY2hhcnRzDQpnZ3Bsb3QoZ29zLCBhZXMoeD1yZW9yZGVyKFRlcm0sQ29tYmluZWQuU2NvcmUpLCB5PUNvbWJpbmVkLlNjb3JlICwgbGFiZWw9Q29tYmluZWQuU2NvcmUpKSArIA0KICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsIGFlcyhmaWxsPUFkanVzdGVkLlAudmFsdWUpLCB3aWR0aD0uNSxwb3NpdGlvbj0iZG9kZ2UiKSAgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIA0KDQoNCiAgbGFicyhzdWJ0aXRsZT0iQ29tYmluZWQgc2NvcmVzIGZyb20gVHJhbnNjcmlwdGlvbl9GYWN0b3JfUFBJcyBwYXRod2F5cyIsIA0KICAgICAgIHRpdGxlPSAiQ0QxMDMgdnMgRFAiKSArIA0KICBjb29yZF9mbGlwKCkNCg0KDQoNCg0KI0NEMTAzdnNETg0KDQpsaXN0X3VwIDwtIGModXBnZW5lcy5paHcucmVzLkNEMTAzdnNETikNCmxpc3RfZG93biA8LSBjKGRvd25nZW5lcy5paHcucmVzLkNEMTAzdnNETikNCg0KDQpldXAgPC0gZW5yaWNocihsaXN0X3VwLCBkYnMpDQplZG93biA8LSBlbnJpY2hyKGxpc3RfZG93biwgZGJzKQ0KDQp1cCA8LSBldXAkS0VHR18yMDE5X01vdXNlDQpkb3duIDwtIGVkb3duJEtFR0dfMjAxOV9Nb3VzZQ0KICAgICAgICAja2VnZw0KdXAkdHlwZSA8LSAidXAiDQpkb3duJHR5cGUgPC0gImRvd24iDQp1cCA8LSB1cFt1cCRBZGp1c3RlZC5QLnZhbHVlPC4wNSxdDQp1cCA8LSB1cFtvcmRlcih1cCRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biA8LSBkb3duW2Rvd24kQWRqdXN0ZWQuUC52YWx1ZTwwLjA1LF0NCmRvd24gPC0gZG93bltvcmRlcihkb3duJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duJENvbWJpbmVkLlNjb3JlIDwtICgtMSkgKiBkb3duJENvbWJpbmVkLlNjb3JlDQpnb3MgPC0gcmJpbmQoZG93bix1cCkNCmdvcyA8LSBuYS5vbWl0KGdvcykgIyBEaXZlcmdpbmcgQmFyY2hhcnRzDQpnZ3Bsb3QoZ29zLCBhZXMoeD1yZW9yZGVyKFRlcm0sQ29tYmluZWQuU2NvcmUpLCB5PUNvbWJpbmVkLlNjb3JlICwgbGFiZWw9Q29tYmluZWQuU2NvcmUpKSArIA0KICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsIGFlcyhmaWxsPUFkanVzdGVkLlAudmFsdWUpLCB3aWR0aD0uNSxwb3NpdGlvbj0iZG9kZ2UiKSAgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIA0KDQoNCiAgbGFicyhzdWJ0aXRsZT0iQ29tYmluZWQgc2NvcmVzIGZyb20gS2VnZyBwYXRod2F5cyIsIA0KICAgICAgIHRpdGxlPSAiQ0QxMDMgdnMgRE4iKSArIA0KICBjb29yZF9mbGlwKCkNCiAgICAgICAgI0dPDQp1cCA8LSBldXAkR09fQmlvbG9naWNhbF9Qcm9jZXNzXzIwMTgNCmRvd24gPC0gZWRvd24kR09fQmlvbG9naWNhbF9Qcm9jZXNzXzIwMTgNCg0KdXAkdHlwZSA8LSAidXAiDQpkb3duJHR5cGUgPC0gImRvd24iDQp1cCA8LSB1cFt1cCRBZGp1c3RlZC5QLnZhbHVlPC4wNSxdDQp1cCA8LSB1cFtvcmRlcih1cCRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biA8LSBkb3duW2Rvd24kQWRqdXN0ZWQuUC52YWx1ZTwwLjA1LF0NCmRvd24gPC0gZG93bltvcmRlcihkb3duJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duJENvbWJpbmVkLlNjb3JlIDwtICgtMSkgKiBkb3duJENvbWJpbmVkLlNjb3JlDQpnb3MgPC0gcmJpbmQoZG93bix1cCkNCmdvcyA8LSBuYS5vbWl0KGdvcykgIyBEaXZlcmdpbmcgQmFyY2hhcnRzDQpnZ3Bsb3QoZ29zLCBhZXMoeD1yZW9yZGVyKFRlcm0sQ29tYmluZWQuU2NvcmUpLCB5PUNvbWJpbmVkLlNjb3JlICwgbGFiZWw9Q29tYmluZWQuU2NvcmUpKSArIA0KICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsIGFlcyhmaWxsPUFkanVzdGVkLlAudmFsdWUpLCB3aWR0aD0uNSxwb3NpdGlvbj0iZG9kZ2UiKSAgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIA0KDQoNCiAgbGFicyhzdWJ0aXRsZT0iQ29tYmluZWQgc2NvcmVzIGZyb20gR08gcGF0aHdheXMiLCANCiAgICAgICB0aXRsZT0gIkNEMTAzIHZzIEROIikgKyANCiAgY29vcmRfZmxpcCgpDQoNCiNUUlJVU1QNCg0KdXAgPC0gZXVwJFRSUlVTVF9UcmFuc2NyaXB0aW9uX0ZhY3RvcnNfMjAxOQ0KZG93biA8LSBlZG93biRUUlJVU1RfVHJhbnNjcmlwdGlvbl9GYWN0b3JzXzIwMTkNCnVwJHR5cGUgPC0gInVwIg0KZG93biR0eXBlIDwtICJkb3duIg0KdXAgPC0gdXBbdXAkQWRqdXN0ZWQuUC52YWx1ZTwuMDUsXQ0KdXAgPC0gdXBbb3JkZXIodXAkQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24gPC0gZG93bltkb3duJEFkanVzdGVkLlAudmFsdWU8MC4wNSxdDQpkb3duIDwtIGRvd25bb3JkZXIoZG93biRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biRDb21iaW5lZC5TY29yZSA8LSAoLTEpICogZG93biRDb21iaW5lZC5TY29yZQ0KZ29zIDwtIHJiaW5kKGRvd24sdXApDQpnb3MgPC0gbmEub21pdChnb3MpICMgRGl2ZXJnaW5nIEJhcmNoYXJ0cw0KZ2dwbG90KGdvcywgYWVzKHg9cmVvcmRlcihUZXJtLENvbWJpbmVkLlNjb3JlKSwgeT1Db21iaW5lZC5TY29yZSAsIGxhYmVsPUNvbWJpbmVkLlNjb3JlKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBhZXMoZmlsbD1BZGp1c3RlZC5QLnZhbHVlKSwgd2lkdGg9LjUscG9zaXRpb249ImRvZGdlIikgICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyANCg0KDQogIGxhYnMoc3VidGl0bGU9IkNvbWJpbmVkIHNjb3JlcyBmcm9tIFRSUlVTVCBwYXRod2F5cyIsIA0KICAgICAgIHRpdGxlPSAiQ0QxMDMgdnMgRE4iKSArIA0KICBjb29yZF9mbGlwKCkNCg0KDQoNCiAgICAgICAgI1RSQU5TRkFDX2FuZF9KQVNQQVJfUFdNcw0KdXAgPC0gZXVwJFRSQU5TRkFDX2FuZF9KQVNQQVJfUFdNcw0KZG93biA8LSBlZG93biRUUkFOU0ZBQ19hbmRfSkFTUEFSX1BXTXMNCnVwJHR5cGUgPC0gInVwIg0KZG93biR0eXBlIDwtICJkb3duIg0KdXAgPC0gdXBbdXAkQWRqdXN0ZWQuUC52YWx1ZTwuMDUsXQ0KdXAgPC0gdXBbb3JkZXIodXAkQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24gPC0gZG93bltkb3duJEFkanVzdGVkLlAudmFsdWU8MC4wNSxdDQpkb3duIDwtIGRvd25bb3JkZXIoZG93biRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biRDb21iaW5lZC5TY29yZSA8LSAoLTEpICogZG93biRDb21iaW5lZC5TY29yZQ0KZ29zIDwtIHJiaW5kKGRvd24sdXApDQpnb3MgPC0gbmEub21pdChnb3MpICMgRGl2ZXJnaW5nIEJhcmNoYXJ0cw0KZ2dwbG90KGdvcywgYWVzKHg9cmVvcmRlcihUZXJtLENvbWJpbmVkLlNjb3JlKSwgeT1Db21iaW5lZC5TY29yZSAsIGxhYmVsPUNvbWJpbmVkLlNjb3JlKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBhZXMoZmlsbD1BZGp1c3RlZC5QLnZhbHVlKSwgd2lkdGg9LjUscG9zaXRpb249ImRvZGdlIikgICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyANCg0KDQogIGxhYnMoc3VidGl0bGU9IkNvbWJpbmVkIHNjb3JlcyBmcm9tIFRSQU5TRkFDX2FuZF9KQVNQQVJfUFdNcyBwYXRod2F5cyIsIA0KICAgICAgIHRpdGxlPSAiQ0QxMDMgdnMgRE4iKSArIA0KICBjb29yZF9mbGlwKCkNCg0KICAgICAgICAjVHJhbnNjcmlwdGlvbl9GYWN0b3JfUFBJcw0KdXAgPC0gZXVwJFRyYW5zY3JpcHRpb25fRmFjdG9yX1BQSXMNCmRvd24gPC0gZWRvd24kVHJhbnNjcmlwdGlvbl9GYWN0b3JfUFBJcw0KdXAkdHlwZSA8LSAidXAiDQpkb3duJHR5cGUgPC0gImRvd24iDQp1cCA8LSB1cFt1cCRBZGp1c3RlZC5QLnZhbHVlPC4wNSxdDQp1cCA8LSB1cFtvcmRlcih1cCRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biA8LSBkb3duW2Rvd24kQWRqdXN0ZWQuUC52YWx1ZTwwLjA1LF0NCmRvd24gPC0gZG93bltvcmRlcihkb3duJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duJENvbWJpbmVkLlNjb3JlIDwtICgtMSkgKiBkb3duJENvbWJpbmVkLlNjb3JlDQpnb3MgPC0gcmJpbmQoZG93bix1cCkNCmdvcyA8LSBuYS5vbWl0KGdvcykgIyBEaXZlcmdpbmcgQmFyY2hhcnRzDQpnZ3Bsb3QoZ29zLCBhZXMoeD1yZW9yZGVyKFRlcm0sQ29tYmluZWQuU2NvcmUpLCB5PUNvbWJpbmVkLlNjb3JlICwgbGFiZWw9Q29tYmluZWQuU2NvcmUpKSArIA0KICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsIGFlcyhmaWxsPUFkanVzdGVkLlAudmFsdWUpLCB3aWR0aD0uNSxwb3NpdGlvbj0iZG9kZ2UiKSAgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIA0KDQoNCiAgbGFicyhzdWJ0aXRsZT0iQ29tYmluZWQgc2NvcmVzIGZyb20gVHJhbnNjcmlwdGlvbl9GYWN0b3JfUFBJcyBwYXRod2F5cyIsIA0KICAgICAgIHRpdGxlPSAiQ0QxMDMgdnMgRE4iKSArIA0KICBjb29yZF9mbGlwKCkNCg0KDQoNCg0KDQojQ0Q0OWEgdnMgRFANCg0KbGlzdF91cCA8LSBjKHVwZ2VuZXMuaWh3LnJlcy5DRDQ5YXZzRFApDQpsaXN0X2Rvd24gPC0gYyhkb3duZ2VuZXMuaWh3LnJlcy5DRDQ5YXZzRFApDQoNCg0KZXVwIDwtIGVucmljaHIobGlzdF91cCwgZGJzKQ0KZWRvd24gPC0gZW5yaWNocihsaXN0X2Rvd24sIGRicykNCg0KdXAgPC0gZXVwJEtFR0dfMjAxOV9Nb3VzZQ0KZG93biA8LSBlZG93biRLRUdHXzIwMTlfTW91c2UNCiAgICAgICAgI2tlZ2cNCnVwJHR5cGUgPC0gInVwIg0KZG93biR0eXBlIDwtICJkb3duIg0KdXAgPC0gdXBbdXAkQWRqdXN0ZWQuUC52YWx1ZTwuMDUsXQ0KdXAgPC0gdXBbb3JkZXIodXAkQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24gPC0gZG93bltkb3duJEFkanVzdGVkLlAudmFsdWU8MC4wNSxdDQpkb3duIDwtIGRvd25bb3JkZXIoZG93biRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biRDb21iaW5lZC5TY29yZSA8LSAoLTEpICogZG93biRDb21iaW5lZC5TY29yZQ0KZ29zIDwtIHJiaW5kKGRvd24sdXApDQpnb3MgPC0gbmEub21pdChnb3MpDQpnb3MgPC0gbmEub21pdChnb3MpICMgRGl2ZXJnaW5nIEJhcmNoYXJ0cw0KZ2dwbG90KGdvcywgYWVzKHg9cmVvcmRlcihUZXJtLENvbWJpbmVkLlNjb3JlKSwgeT1Db21iaW5lZC5TY29yZSAsIGxhYmVsPUNvbWJpbmVkLlNjb3JlKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBhZXMoZmlsbD1BZGp1c3RlZC5QLnZhbHVlKSwgd2lkdGg9LjUscG9zaXRpb249ImRvZGdlIikgICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyANCg0KDQogIGxhYnMoc3VidGl0bGU9IkNvbWJpbmVkIHNjb3JlcyBmcm9tIEtlZ2cgcGF0aHdheXMiLCANCiAgICAgICB0aXRsZT0gIkNENDlhIHZzIERQIikgKyANCiAgY29vcmRfZmxpcCgpDQogICAgICAgICNHTw0KdXAgPC0gZXVwJEdPX0Jpb2xvZ2ljYWxfUHJvY2Vzc18yMDE4DQpkb3duIDwtIGVkb3duJEdPX0Jpb2xvZ2ljYWxfUHJvY2Vzc18yMDE4DQoNCnVwJHR5cGUgPC0gInVwIg0KZG93biR0eXBlIDwtICJkb3duIg0KdXAgPC0gdXBbdXAkQWRqdXN0ZWQuUC52YWx1ZTwuMDUsXQ0KdXAgPC0gdXBbb3JkZXIodXAkQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24gPC0gZG93bltkb3duJEFkanVzdGVkLlAudmFsdWU8MC4wNSxdDQpkb3duIDwtIGRvd25bb3JkZXIoZG93biRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biRDb21iaW5lZC5TY29yZSA8LSAoLTEpICogZG93biRDb21iaW5lZC5TY29yZQ0KZ29zIDwtIHJiaW5kKGRvd24sdXApDQpnb3MgPC0gbmEub21pdChnb3MpICMgRGl2ZXJnaW5nIEJhcmNoYXJ0cw0KZ2dwbG90KGdvcywgYWVzKHg9cmVvcmRlcihUZXJtLENvbWJpbmVkLlNjb3JlKSwgeT1Db21iaW5lZC5TY29yZSAsIGxhYmVsPUNvbWJpbmVkLlNjb3JlKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBhZXMoZmlsbD1BZGp1c3RlZC5QLnZhbHVlKSwgd2lkdGg9LjUscG9zaXRpb249ImRvZGdlIikgICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyANCg0KDQogIGxhYnMoc3VidGl0bGU9IkNvbWJpbmVkIHNjb3JlcyBmcm9tIEdPIHBhdGh3YXlzIiwgDQogICAgICAgdGl0bGU9ICJDRDQ5YSB2cyBEUCIpICsgDQogIGNvb3JkX2ZsaXAoKQ0KDQoNCg0KI1RSUlVTVA0KdXAgPC0gZXVwJFRSUlVTVF9UcmFuc2NyaXB0aW9uX0ZhY3RvcnNfMjAxOQ0KZG93biA8LSBlZG93biRUUlJVU1RfVHJhbnNjcmlwdGlvbl9GYWN0b3JzXzIwMTkNCnVwJHR5cGUgPC0gInVwIg0KZG93biR0eXBlIDwtICJkb3duIg0KdXAgPC0gdXBbdXAkQWRqdXN0ZWQuUC52YWx1ZTwuMDUsXQ0KdXAgPC0gdXBbb3JkZXIodXAkQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24gPC0gZG93bltkb3duJEFkanVzdGVkLlAudmFsdWU8MC4wNSxdDQpkb3duIDwtIGRvd25bb3JkZXIoZG93biRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biRDb21iaW5lZC5TY29yZSA8LSAoLTEpICogZG93biRDb21iaW5lZC5TY29yZQ0KZ29zIDwtIHJiaW5kKGRvd24sdXApDQpnb3MgPC0gbmEub21pdChnb3MpICMgRGl2ZXJnaW5nIEJhcmNoYXJ0cw0KZ2dwbG90KGdvcywgYWVzKHg9cmVvcmRlcihUZXJtLENvbWJpbmVkLlNjb3JlKSwgeT1Db21iaW5lZC5TY29yZSAsIGxhYmVsPUNvbWJpbmVkLlNjb3JlKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBhZXMoZmlsbD1BZGp1c3RlZC5QLnZhbHVlKSwgd2lkdGg9LjUscG9zaXRpb249ImRvZGdlIikgICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyANCg0KDQogIGxhYnMoc3VidGl0bGU9IkNvbWJpbmVkIHNjb3JlcyBmcm9tIFRSUlVTVCBwYXRod2F5cyIsIA0KICAgICAgIHRpdGxlPSAiQ0Q0OWEgdnMgRFAiKSArIA0KICBjb29yZF9mbGlwKCkNCg0KDQogICAgICAgICNUUkFOU0ZBQ19hbmRfSkFTUEFSX1BXTXMNCnVwIDwtIGV1cCRUUkFOU0ZBQ19hbmRfSkFTUEFSX1BXTXMNCmRvd24gPC0gZWRvd24kVFJBTlNGQUNfYW5kX0pBU1BBUl9QV01zDQp1cCR0eXBlIDwtICJ1cCINCmRvd24kdHlwZSA8LSAiZG93biINCnVwIDwtIHVwW3VwJEFkanVzdGVkLlAudmFsdWU8LjA1LF0NCnVwIDwtIHVwW29yZGVyKHVwJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duIDwtIGRvd25bZG93biRBZGp1c3RlZC5QLnZhbHVlPDAuMDUsXQ0KZG93biA8LSBkb3duW29yZGVyKGRvd24kQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24kQ29tYmluZWQuU2NvcmUgPC0gKC0xKSAqIGRvd24kQ29tYmluZWQuU2NvcmUNCmdvcyA8LSByYmluZChkb3duLHVwKQ0KZ29zIDwtIG5hLm9taXQoZ29zKSAjIERpdmVyZ2luZyBCYXJjaGFydHMNCmdncGxvdChnb3MsIGFlcyh4PXJlb3JkZXIoVGVybSxDb21iaW5lZC5TY29yZSksIHk9Q29tYmluZWQuU2NvcmUgLCBsYWJlbD1Db21iaW5lZC5TY29yZSkpICsgDQogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JywgYWVzKGZpbGw9QWRqdXN0ZWQuUC52YWx1ZSksIHdpZHRoPS41LHBvc2l0aW9uPSJkb2RnZSIpICArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsgDQoNCg0KICBsYWJzKHN1YnRpdGxlPSJDb21iaW5lZCBzY29yZXMgZnJvbSBUUkFOU0ZBQ19hbmRfSkFTUEFSX1BXTXMgcGF0aHdheXMiLCANCiAgICAgICB0aXRsZT0gIkNENDlhIHZzIERQIikgKyANCiAgY29vcmRfZmxpcCgpDQoNCiAgICAgICAgI1RyYW5zY3JpcHRpb25fRmFjdG9yX1BQSXMNCnVwIDwtIGV1cCRUcmFuc2NyaXB0aW9uX0ZhY3Rvcl9QUElzDQpkb3duIDwtIGVkb3duJFRyYW5zY3JpcHRpb25fRmFjdG9yX1BQSXMNCiN1cCR0eXBlIDwtICJ1cCINCmRvd24kdHlwZSA8LSAiZG93biINCnVwIDwtIHVwW3VwJEFkanVzdGVkLlAudmFsdWU8LjA1LF0NCnVwIDwtIHVwW29yZGVyKHVwJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duIDwtIGRvd25bZG93biRBZGp1c3RlZC5QLnZhbHVlPDAuMDUsXQ0KZG93biA8LSBkb3duW29yZGVyKGRvd24kQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24kQ29tYmluZWQuU2NvcmUgPC0gKC0xKSAqIGRvd24kQ29tYmluZWQuU2NvcmUNCmdvcyA8LSByYmluZChkb3duKQ0KZ29zIDwtIG5hLm9taXQoZ29zKSAjIERpdmVyZ2luZyBCYXJjaGFydHMNCmdncGxvdChnb3MsIGFlcyh4PXJlb3JkZXIoVGVybSxDb21iaW5lZC5TY29yZSksIHk9Q29tYmluZWQuU2NvcmUgLCBsYWJlbD1Db21iaW5lZC5TY29yZSkpICsgDQogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JywgYWVzKGZpbGw9QWRqdXN0ZWQuUC52YWx1ZSksIHdpZHRoPS41LHBvc2l0aW9uPSJkb2RnZSIpICArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsgDQoNCg0KICBsYWJzKHN1YnRpdGxlPSJDb21iaW5lZCBzY29yZXMgZnJvbSBUcmFuc2NyaXB0aW9uX0ZhY3Rvcl9QUElzIHBhdGh3YXlzIiwgDQogICAgICAgdGl0bGU9ICJDRDQ5YSB2cyBEUCIpICsgDQogIGNvb3JkX2ZsaXAoKQ0KDQoNCg0KI0NENDlhIHZzIERODQoNCmxpc3RfdXAgPC0gYyh1cGdlbmVzLmlody5yZXMuQ0Q0OWF2c0ROKQ0KbGlzdF9kb3duIDwtIGMoZG93bmdlbmVzLmlody5yZXMuQ0Q0OWF2c0ROKQ0KDQoNCmV1cCA8LSBlbnJpY2hyKGxpc3RfdXAsIGRicykNCmVkb3duIDwtIGVucmljaHIobGlzdF9kb3duLCBkYnMpDQoNCnVwIDwtIGV1cCRLRUdHXzIwMTlfTW91c2UNCmRvd24gPC0gZWRvd24kS0VHR18yMDE5X01vdXNlDQogICAgICAgICNrZWdnDQp1cCR0eXBlIDwtICJ1cCINCmRvd24kdHlwZSA8LSAiZG93biINCnVwIDwtIHVwW3VwJEFkanVzdGVkLlAudmFsdWU8LjA1LF0NCnVwIDwtIHVwW29yZGVyKHVwJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duIDwtIGRvd25bZG93biRBZGp1c3RlZC5QLnZhbHVlPDAuMDUsXQ0KZG93biA8LSBkb3duW29yZGVyKGRvd24kQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24kQ29tYmluZWQuU2NvcmUgPC0gKC0xKSAqIGRvd24kQ29tYmluZWQuU2NvcmUNCmdvcyA8LSByYmluZChkb3duLHVwKQ0KZ29zIDwtIG5hLm9taXQoZ29zKSAjIERpdmVyZ2luZyBCYXJjaGFydHMNCmdncGxvdChnb3MsIGFlcyh4PXJlb3JkZXIoVGVybSxDb21iaW5lZC5TY29yZSksIHk9Q29tYmluZWQuU2NvcmUgLCBsYWJlbD1Db21iaW5lZC5TY29yZSkpICsgDQogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JywgYWVzKGZpbGw9QWRqdXN0ZWQuUC52YWx1ZSksIHdpZHRoPS41LHBvc2l0aW9uPSJkb2RnZSIpICArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsgDQoNCg0KICBsYWJzKHN1YnRpdGxlPSJDb21iaW5lZCBzY29yZXMgZnJvbSBLZWdnIHBhdGh3YXlzIiwgDQogICAgICAgdGl0bGU9ICJDRDQ5YSB2cyBETiIpICsgDQogIGNvb3JkX2ZsaXAoKQ0KICAgICAgICAjR08NCnVwIDwtIGV1cCRHT19CaW9sb2dpY2FsX1Byb2Nlc3NfMjAxOA0KZG93biA8LSBlZG93biRHT19CaW9sb2dpY2FsX1Byb2Nlc3NfMjAxOA0KDQp1cCR0eXBlIDwtICJ1cCINCmRvd24kdHlwZSA8LSAiZG93biINCnVwIDwtIHVwW3VwJEFkanVzdGVkLlAudmFsdWU8LjA1LF0NCnVwIDwtIHVwW29yZGVyKHVwJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duIDwtIGRvd25bZG93biRBZGp1c3RlZC5QLnZhbHVlPDAuMDUsXQ0KZG93biA8LSBkb3duW29yZGVyKGRvd24kQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24kQ29tYmluZWQuU2NvcmUgPC0gKC0xKSAqIGRvd24kQ29tYmluZWQuU2NvcmUNCmdvcyA8LSByYmluZChkb3duLHVwKQ0KZ29zIDwtIG5hLm9taXQoZ29zKSAjIERpdmVyZ2luZyBCYXJjaGFydHMNCmdncGxvdChnb3MsIGFlcyh4PXJlb3JkZXIoVGVybSxDb21iaW5lZC5TY29yZSksIHk9Q29tYmluZWQuU2NvcmUgLCBsYWJlbD1Db21iaW5lZC5TY29yZSkpICsgDQogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JywgYWVzKGZpbGw9QWRqdXN0ZWQuUC52YWx1ZSksIHdpZHRoPS41LHBvc2l0aW9uPSJkb2RnZSIpICArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsgDQoNCg0KICBsYWJzKHN1YnRpdGxlPSJDb21iaW5lZCBzY29yZXMgZnJvbSBHTyBwYXRod2F5cyIsIA0KICAgICAgIHRpdGxlPSAiQ0Q0OWEgdnMgRE4iKSArIA0KICBjb29yZF9mbGlwKCkNCg0KDQoNCiNUUlJVU1QNCnVwIDwtIGV1cCRUUlJVU1RfVHJhbnNjcmlwdGlvbl9GYWN0b3JzXzIwMTkNCmRvd24gPC0gZWRvd24kVFJSVVNUX1RyYW5zY3JpcHRpb25fRmFjdG9yc18yMDE5DQp1cCR0eXBlIDwtICJ1cCINCmRvd24kdHlwZSA8LSAiZG93biINCnVwIDwtIHVwW3VwJEFkanVzdGVkLlAudmFsdWU8LjA1LF0NCnVwIDwtIHVwW29yZGVyKHVwJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duIDwtIGRvd25bZG93biRBZGp1c3RlZC5QLnZhbHVlPDAuMDUsXQ0KZG93biA8LSBkb3duW29yZGVyKGRvd24kQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24kQ29tYmluZWQuU2NvcmUgPC0gKC0xKSAqIGRvd24kQ29tYmluZWQuU2NvcmUNCmdvcyA8LSByYmluZChkb3duLHVwKQ0KZ29zIDwtIG5hLm9taXQoZ29zKSAjIERpdmVyZ2luZyBCYXJjaGFydHMNCmdncGxvdChnb3MsIGFlcyh4PXJlb3JkZXIoVGVybSxDb21iaW5lZC5TY29yZSksIHk9Q29tYmluZWQuU2NvcmUgLCBsYWJlbD1Db21iaW5lZC5TY29yZSkpICsgDQogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JywgYWVzKGZpbGw9QWRqdXN0ZWQuUC52YWx1ZSksIHdpZHRoPS41LHBvc2l0aW9uPSJkb2RnZSIpICArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsgDQoNCg0KICBsYWJzKHN1YnRpdGxlPSJDb21iaW5lZCBzY29yZXMgZnJvbSBUUlJVU1QgcGF0aHdheXMiLCANCiAgICAgICB0aXRsZT0gIkNENDlhIHZzIEROIikgKyANCiAgY29vcmRfZmxpcCgpDQoNCg0KICAgICAgICAjVFJBTlNGQUNfYW5kX0pBU1BBUl9QV01zDQp1cCA8LSBldXAkVFJBTlNGQUNfYW5kX0pBU1BBUl9QV01zDQpkb3duIDwtIGVkb3duJFRSQU5TRkFDX2FuZF9KQVNQQVJfUFdNcw0KdXAkdHlwZSA8LSAidXAiDQpkb3duJHR5cGUgPC0gImRvd24iDQp1cCA8LSB1cFt1cCRBZGp1c3RlZC5QLnZhbHVlPC4wNSxdDQp1cCA8LSB1cFtvcmRlcih1cCRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biA8LSBkb3duW2Rvd24kQWRqdXN0ZWQuUC52YWx1ZTwwLjA1LF0NCmRvd24gPC0gZG93bltvcmRlcihkb3duJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duJENvbWJpbmVkLlNjb3JlIDwtICgtMSkgKiBkb3duJENvbWJpbmVkLlNjb3JlDQpnb3MgPC0gcmJpbmQoZG93bix1cCkNCmdvcyA8LSBuYS5vbWl0KGdvcykgIyBEaXZlcmdpbmcgQmFyY2hhcnRzDQpnZ3Bsb3QoZ29zLCBhZXMoeD1yZW9yZGVyKFRlcm0sQ29tYmluZWQuU2NvcmUpLCB5PUNvbWJpbmVkLlNjb3JlICwgbGFiZWw9Q29tYmluZWQuU2NvcmUpKSArIA0KICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsIGFlcyhmaWxsPUFkanVzdGVkLlAudmFsdWUpLCB3aWR0aD0uNSxwb3NpdGlvbj0iZG9kZ2UiKSAgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIA0KDQoNCiAgbGFicyhzdWJ0aXRsZT0iQ29tYmluZWQgc2NvcmVzIGZyb20gVFJBTlNGQUNfYW5kX0pBU1BBUl9QV01zIHBhdGh3YXlzIiwgDQogICAgICAgdGl0bGU9ICJDRDQ5YSB2cyBETiIpICsgDQogIGNvb3JkX2ZsaXAoKQ0KDQogICAgICAgICNUcmFuc2NyaXB0aW9uX0ZhY3Rvcl9QUElzDQp1cCA8LSBldXAkVHJhbnNjcmlwdGlvbl9GYWN0b3JfUFBJcw0KZG93biA8LSBlZG93biRUcmFuc2NyaXB0aW9uX0ZhY3Rvcl9QUElzDQp1cCR0eXBlIDwtICJ1cCINCmRvd24kdHlwZSA8LSAiZG93biINCnVwIDwtIHVwW3VwJEFkanVzdGVkLlAudmFsdWU8LjA1LF0NCnVwIDwtIHVwW29yZGVyKHVwJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duIDwtIGRvd25bZG93biRBZGp1c3RlZC5QLnZhbHVlPDAuMDUsXQ0KZG93biA8LSBkb3duW29yZGVyKGRvd24kQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24kQ29tYmluZWQuU2NvcmUgPC0gKC0xKSAqIGRvd24kQ29tYmluZWQuU2NvcmUNCmdvcyA8LSByYmluZChkb3duLHVwKQ0KZ29zIDwtIG5hLm9taXQoZ29zKSAjIERpdmVyZ2luZyBCYXJjaGFydHMNCmdncGxvdChnb3MsIGFlcyh4PXJlb3JkZXIoVGVybSxDb21iaW5lZC5TY29yZSksIHk9Q29tYmluZWQuU2NvcmUgLCBsYWJlbD1Db21iaW5lZC5TY29yZSkpICsgDQogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JywgYWVzKGZpbGw9QWRqdXN0ZWQuUC52YWx1ZSksIHdpZHRoPS41LHBvc2l0aW9uPSJkb2RnZSIpICArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsgDQoNCg0KICBsYWJzKHN1YnRpdGxlPSJDb21iaW5lZCBzY29yZXMgZnJvbSBUcmFuc2NyaXB0aW9uX0ZhY3Rvcl9QUElzIHBhdGh3YXlzIiwgDQogICAgICAgdGl0bGU9ICJDRDQ5YSB2cyBETiIpICsgDQogIGNvb3JkX2ZsaXAoKQ0KDQoNCg0KDQojRFAgdnMgRE4NCg0KbGlzdF91cCA8LSBjKHVwZ2VuZXMuaWh3LnJlcy5EUHZzRE4pDQpsaXN0X2Rvd24gPC0gYyhkb3duZ2VuZXMuaWh3LnJlcy5EUHZzRE4pDQoNCg0KZXVwIDwtIGVucmljaHIobGlzdF91cCwgZGJzKQ0KZWRvd24gPC0gZW5yaWNocihsaXN0X2Rvd24sIGRicykNCg0KdXAgPC0gZXVwJEtFR0dfMjAxOV9Nb3VzZQ0KZG93biA8LSBlZG93biRLRUdHXzIwMTlfTW91c2UNCiAgICAgICAgI2tlZ2cNCnVwJHR5cGUgPC0gInVwIg0KZG93biR0eXBlIDwtICJkb3duIg0KdXAgPC0gdXBbdXAkQWRqdXN0ZWQuUC52YWx1ZTwuMDUsXQ0KdXAgPC0gdXBbb3JkZXIodXAkQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24gPC0gZG93bltkb3duJEFkanVzdGVkLlAudmFsdWU8MC4wNSxdDQpkb3duIDwtIGRvd25bb3JkZXIoZG93biRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biRDb21iaW5lZC5TY29yZSA8LSAoLTEpICogZG93biRDb21iaW5lZC5TY29yZQ0KZ29zIDwtIHJiaW5kKGRvd24sdXApDQpnb3MgPC0gbmEub21pdChnb3MpICMgRGl2ZXJnaW5nIEJhcmNoYXJ0cw0KZ2dwbG90KGdvcywgYWVzKHg9cmVvcmRlcihUZXJtLENvbWJpbmVkLlNjb3JlKSwgeT1Db21iaW5lZC5TY29yZSAsIGxhYmVsPUNvbWJpbmVkLlNjb3JlKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBhZXMoZmlsbD1BZGp1c3RlZC5QLnZhbHVlKSwgd2lkdGg9LjUscG9zaXRpb249ImRvZGdlIikgICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyANCg0KDQogIGxhYnMoc3VidGl0bGU9IkNvbWJpbmVkIHNjb3JlcyBmcm9tIEtlZ2cgcGF0aHdheXMiLCANCiAgICAgICB0aXRsZT0gIkRQIHZzIEROIikgKyANCiAgY29vcmRfZmxpcCgpDQogICAgICAgICNHTw0KdXAgPC0gZXVwJEdPX0Jpb2xvZ2ljYWxfUHJvY2Vzc18yMDE4DQpkb3duIDwtIGVkb3duJEdPX0Jpb2xvZ2ljYWxfUHJvY2Vzc18yMDE4DQoNCnVwJHR5cGUgPC0gInVwIg0KZG93biR0eXBlIDwtICJkb3duIg0KdXAgPC0gdXBbdXAkQWRqdXN0ZWQuUC52YWx1ZTwuMDUsXQ0KdXAgPC0gdXBbb3JkZXIodXAkQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24gPC0gZG93bltkb3duJEFkanVzdGVkLlAudmFsdWU8MC4wNSxdDQpkb3duIDwtIGRvd25bb3JkZXIoZG93biRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biRDb21iaW5lZC5TY29yZSA8LSAoLTEpICogZG93biRDb21iaW5lZC5TY29yZQ0KZ29zIDwtIHJiaW5kKGRvd24sdXApDQpnb3MgPC0gbmEub21pdChnb3MpICMgRGl2ZXJnaW5nIEJhcmNoYXJ0cw0KZ2dwbG90KGdvcywgYWVzKHg9cmVvcmRlcihUZXJtLENvbWJpbmVkLlNjb3JlKSwgeT1Db21iaW5lZC5TY29yZSAsIGxhYmVsPUNvbWJpbmVkLlNjb3JlKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBhZXMoZmlsbD1BZGp1c3RlZC5QLnZhbHVlKSwgd2lkdGg9LjUscG9zaXRpb249ImRvZGdlIikgICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyANCg0KDQogIGxhYnMoc3VidGl0bGU9IkNvbWJpbmVkIHNjb3JlcyBmcm9tIEdPIHBhdGh3YXlzIiwgDQogICAgICAgdGl0bGU9ICJEUCB2cyBETiIpICsgDQogIGNvb3JkX2ZsaXAoKQ0KDQojVFJSVVNUDQp1cCA8LSBldXAkVFJSVVNUX1RyYW5zY3JpcHRpb25fRmFjdG9yc18yMDE5DQpkb3duIDwtIGVkb3duJFRSUlVTVF9UcmFuc2NyaXB0aW9uX0ZhY3RvcnNfMjAxOQ0KdXAkdHlwZSA8LSAidXAiDQpkb3duJHR5cGUgPC0gImRvd24iDQp1cCA8LSB1cFt1cCRBZGp1c3RlZC5QLnZhbHVlPC4wNSxdDQp1cCA8LSB1cFtvcmRlcih1cCRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biA8LSBkb3duW2Rvd24kQWRqdXN0ZWQuUC52YWx1ZTwwLjA1LF0NCmRvd24gPC0gZG93bltvcmRlcihkb3duJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duJENvbWJpbmVkLlNjb3JlIDwtICgtMSkgKiBkb3duJENvbWJpbmVkLlNjb3JlDQpnb3MgPC0gcmJpbmQoZG93bix1cCkNCmdvcyA8LSBuYS5vbWl0KGdvcykgIyBEaXZlcmdpbmcgQmFyY2hhcnRzDQpnZ3Bsb3QoZ29zLCBhZXMoeD1yZW9yZGVyKFRlcm0sQ29tYmluZWQuU2NvcmUpLCB5PUNvbWJpbmVkLlNjb3JlICwgbGFiZWw9Q29tYmluZWQuU2NvcmUpKSArIA0KICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsIGFlcyhmaWxsPUFkanVzdGVkLlAudmFsdWUpLCB3aWR0aD0uNSxwb3NpdGlvbj0iZG9kZ2UiKSAgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIA0KDQoNCiAgbGFicyhzdWJ0aXRsZT0iQ29tYmluZWQgc2NvcmVzIGZyb20gVFJSVVNUIHBhdGh3YXlzIiwgDQogICAgICAgdGl0bGU9ICJEUCB2cyBETiIpICsgDQogIGNvb3JkX2ZsaXAoKQ0KDQoNCiAgICAgICAgI1RSQU5TRkFDX2FuZF9KQVNQQVJfUFdNcw0KdXAgPC0gZXVwJFRSQU5TRkFDX2FuZF9KQVNQQVJfUFdNcw0KZG93biA8LSBlZG93biRUUkFOU0ZBQ19hbmRfSkFTUEFSX1BXTXMNCnVwJHR5cGUgPC0gInVwIg0KZG93biR0eXBlIDwtICJkb3duIg0KdXAgPC0gdXBbdXAkQWRqdXN0ZWQuUC52YWx1ZTwuMDUsXQ0KdXAgPC0gdXBbb3JkZXIodXAkQ29tYmluZWQuU2NvcmUpLCBdICAjIHNvcnQNCmRvd24gPC0gZG93bltkb3duJEFkanVzdGVkLlAudmFsdWU8MC4wNSxdDQpkb3duIDwtIGRvd25bb3JkZXIoZG93biRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biRDb21iaW5lZC5TY29yZSA8LSAoLTEpICogZG93biRDb21iaW5lZC5TY29yZQ0KZ29zIDwtIHJiaW5kKGRvd24sdXApDQpnb3MgPC0gbmEub21pdChnb3MpICMgRGl2ZXJnaW5nIEJhcmNoYXJ0cw0KZ2dwbG90KGdvcywgYWVzKHg9cmVvcmRlcihUZXJtLENvbWJpbmVkLlNjb3JlKSwgeT1Db21iaW5lZC5TY29yZSAsIGxhYmVsPUNvbWJpbmVkLlNjb3JlKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBhZXMoZmlsbD1BZGp1c3RlZC5QLnZhbHVlKSwgd2lkdGg9LjUscG9zaXRpb249ImRvZGdlIikgICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyANCg0KDQogIGxhYnMoc3VidGl0bGU9IkNvbWJpbmVkIHNjb3JlcyBmcm9tIFRSQU5TRkFDX2FuZF9KQVNQQVJfUFdNcyBwYXRod2F5cyIsIA0KICAgICAgIHRpdGxlPSAiRFAgdnMgRE4iKSArIA0KICBjb29yZF9mbGlwKCkNCg0KICAgICAgICAjVHJhbnNjcmlwdGlvbl9GYWN0b3JfUFBJcw0KdXAgPC0gZXVwJFRyYW5zY3JpcHRpb25fRmFjdG9yX1BQSXMNCmRvd24gPC0gZWRvd24kVHJhbnNjcmlwdGlvbl9GYWN0b3JfUFBJcw0KdXAkdHlwZSA8LSAidXAiDQpkb3duJHR5cGUgPC0gImRvd24iDQp1cCA8LSB1cFt1cCRBZGp1c3RlZC5QLnZhbHVlPC4wNSxdDQp1cCA8LSB1cFtvcmRlcih1cCRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biA8LSBkb3duW2Rvd24kQWRqdXN0ZWQuUC52YWx1ZTwwLjA1LF0NCmRvd24gPC0gZG93bltvcmRlcihkb3duJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duJENvbWJpbmVkLlNjb3JlIDwtICgtMSkgKiBkb3duJENvbWJpbmVkLlNjb3JlDQpnb3MgPC0gcmJpbmQoZG93bix1cCkNCmdvcyA8LSBuYS5vbWl0KGdvcykgIyBEaXZlcmdpbmcgQmFyY2hhcnRzDQpnZ3Bsb3QoZ29zLCBhZXMoeD1yZW9yZGVyKFRlcm0sQ29tYmluZWQuU2NvcmUpLCB5PUNvbWJpbmVkLlNjb3JlICwgbGFiZWw9Q29tYmluZWQuU2NvcmUpKSArIA0KICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsIGFlcyhmaWxsPUFkanVzdGVkLlAudmFsdWUpLCB3aWR0aD0uNSxwb3NpdGlvbj0iZG9kZ2UiKSAgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIA0KDQoNCiAgbGFicyhzdWJ0aXRsZT0iQ29tYmluZWQgc2NvcmVzIGZyb20gVHJhbnNjcmlwdGlvbl9GYWN0b3JfUFBJcyBwYXRod2F5cyIsIA0KICAgICAgIHRpdGxlPSAiRFAgdnMgRE4iKSArIA0KICBjb29yZF9mbGlwKCkNCg0KDQogICNSZWFjdG9tZQ0KdXAgPC0gZXVwJFJlYWN0b21lXzIwMTYNCmRvd24gPC0gZWRvd24kUmVhY3RvbWVfMjAxNg0KdXAkdHlwZSA8LSAidXAiDQpkb3duJHR5cGUgPC0gImRvd24iDQp1cCA8LSB1cFt1cCRBZGp1c3RlZC5QLnZhbHVlPC4wNSxdDQp1cCA8LSB1cFtvcmRlcih1cCRDb21iaW5lZC5TY29yZSksIF0gICMgc29ydA0KZG93biA8LSBkb3duW2Rvd24kQWRqdXN0ZWQuUC52YWx1ZTwwLjA1LF0NCmRvd24gPC0gZG93bltvcmRlcihkb3duJENvbWJpbmVkLlNjb3JlKSwgXSAgIyBzb3J0DQpkb3duJENvbWJpbmVkLlNjb3JlIDwtICgtMSkgKiBkb3duJENvbWJpbmVkLlNjb3JlDQpnb3MgPC0gcmJpbmQoZG93bix1cCkNCmdvcyA8LSBuYS5vbWl0KGdvcykgIyBEaXZlcmdpbmcgQmFyY2hhcnRzDQpnZ3Bsb3QoZ29zLCBhZXMoeD1yZW9yZGVyKFRlcm0sQ29tYmluZWQuU2NvcmUpLCB5PUNvbWJpbmVkLlNjb3JlICwgbGFiZWw9Q29tYmluZWQuU2NvcmUpKSArIA0KICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsIGFlcyhmaWxsPUFkanVzdGVkLlAudmFsdWUpLCB3aWR0aD0uNSxwb3NpdGlvbj0iZG9kZ2UiKSAgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIA0KDQoNCiAgbGFicyhzdWJ0aXRsZT0iQ29tYmluZWQgc2NvcmVzIGZyb20gUmVhY3RvbWVfMjAxNiBwYXRod2F5cyIsIA0KICAgICAgIHRpdGxlPSAiRFAgdnMgRE4iKSArIA0KICBjb29yZF9mbGlwKCkNCg0KYGBgDQoNCmBgYHtyfQ0KI3RvIHdyaXRlIGNzdnMgb2YgZHAgdnMgZG4gZ2VuZXMsIHdlIG5lZWQgdG8gcmV3cml0ZSBldXAgYW5kIGVkb3duIGFzIHdlIGRpZCBhYm92ZQ0KbGlzdF91cCA8LSBjKHVwZ2VuZXMuaWh3LnJlcy5EUHZzRE4pDQpsaXN0X2Rvd24gPC0gYyhkb3duZ2VuZXMuaWh3LnJlcy5EUHZzRE4pDQpldXAgPC0gZW5yaWNocihsaXN0X3VwLCBkYnMpDQplZG93biA8LSBlbnJpY2hyKGxpc3RfZG93biwgZGJzKQ0KI3dyaXRlIGNzdnMgb2YgdGhlIGRwIHZzIGRuIGdlbmUgc2V0IGVucmljaG1lbnQgYW5hbHlzaWVzDQojdXANCndyaXRlLmNzdihldXAkS0VHR18yMDE5X01vdXNlLCd1cGtlZ2dkcGRuLmNzdicpDQp3cml0ZS5jc3YoZXVwJEdPX0Jpb2xvZ2ljYWxfUHJvY2Vzc18yMDE4LCd1cGdvZHBkbi5jc3YnKQ0Kd3JpdGUuY3N2KGV1cCRUUlJVU1RfVHJhbnNjcmlwdGlvbl9GYWN0b3JzXzIwMTksJ3VwdHJydXN0ZHBkbi5jc3YnKQ0Kd3JpdGUuY3N2KGV1cCRUUkFOU0ZBQ19hbmRfSkFTUEFSX1BXTXMsJ3VwdHJhbnNmYWNkcGRuLmNzdicpDQp3cml0ZS5jc3YoZXVwJFRyYW5zY3JpcHRpb25fRmFjdG9yX1BQSXMsJ3VwdGZwcGlzZHBkbi5jc3YnKQ0Kd3JpdGUuY3N2KGV1cCRSZWFjdG9tZV8yMDE2LCd1cHJlYWN0b21lZHBkbi5jc3YnKQ0KI2Rvd24NCndyaXRlLmNzdihlZG93biRLRUdHXzIwMTlfTW91c2UsJ2Rvd25rZWdnZHBkbi5jc3YnKQ0Kd3JpdGUuY3N2KGVkb3duJEdPX0Jpb2xvZ2ljYWxfUHJvY2Vzc18yMDE4LCdkb3duZ29kcGRuLmNzdicpDQp3cml0ZS5jc3YoZWRvd24kVFJSVVNUX1RyYW5zY3JpcHRpb25fRmFjdG9yc18yMDE5LCdkb3dudHJydXN0ZHBkbi5jc3YnKQ0Kd3JpdGUuY3N2KGVkb3duJFRSQU5TRkFDX2FuZF9KQVNQQVJfUFdNcywnZG93bnRyYW5zZmFjZHBkbi5jc3YnKQ0Kd3JpdGUuY3N2KGVkb3duJFRyYW5zY3JpcHRpb25fRmFjdG9yX1BQSXMsJ2Rvd250ZnBwaXNkcGRuLmNzdicpDQp3cml0ZS5jc3YoZWRvd24kUmVhY3RvbWVfMjAxNiwnZG93bnJlYWN0b21lZHBkbi5jc3YnKQ0KYGBgDQoNCmBgYHtyfQ0KI21ha2UgdmVubiBkaWFncmFtIHRvIGxvb2sgYXQgdXByZWd1bGF0ZWQgZ2VuZXMuIFdoYXQgbnVtYmVyIG9mIGdlbmVzIGFyZSB1cHJlZ3VsYXRlZCBpbiB3aGljaCBjb21wYXJpc29ucz8NCmxpYnJhcnkoVmVubkRpYWdyYW0pDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCnZpcmlkaXMzPC12aXJpZGlzKG49MykNCm15Y29sIDwtIGMoJyM4NzQ0ZjYnLCcjNDE0MTQxJywnI2FjZmFmYScpDQojIHZlbm4uZGlhZ3JhbSh4PWxpc3QodXBnZW5lcy5paHcucmVzLkRQdnNETix1cGdlbmVzLmlody5yZXMuQ0Q0OWF2c0ROLHVwZ2VuZXMuaWh3LnJlcy5DRDEwM3ZzRE4pLA0KIyAgIGNhdGVnb3J5Lm5hbWVzID0gYygnJywnJywnJyksDQojICAgZmlsZW5hbWU9J3N0aW11cHJlZ3VsYXRlZHZlbm5maW5hbC5wbmcnLA0KIyAgIG91dHB1dD1ULCAgDQojICAgICAgICAgICMgT3V0cHV0IGZlYXR1cmVzDQojICAgICAgICAgaW1hZ2V0eXBlPSJwbmciICwNCiMgICAgICAgICBoZWlnaHQgPSAyMDAwICwgDQojICAgICAgICAgd2lkdGggPSAyMDAwICwgDQojICAgICAgICAgcmVzb2x1dGlvbiA9IDEyMDAsDQojICAgICAgICAgY29tcHJlc3Npb24gPSAibHp3IiwNCiMgICAgICAgICANCiMgICAgICAgICAjIENpcmNsZXMNCiMgICAgICAgICBsd2QgPSAxLA0KIyAgICAgICAgIGx0eSA9IGMoMSwxLDEpLA0KIyAgICAgICAgIGZpbGwgPSBteWNvbCwNCiMgICBjb2w9YygnIzIyMjIyMicsJyMyMjIyMjInLCcjMjIyMjIyJyksDQojICAgICAgICAgYWxwaGE9YyguNywuOCwuOCksDQojICAgICAgICAgDQojICAgICAgICAgIyBOdW1iZXJzDQojICAgICAgICAgY2V4ID0gLjYsDQojICAgICAgICAgZm9udGZhY2UgPSAiYm9sZCIsDQojICAgICAgICAgZm9udGZhbWlseSA9ICJzYW5zIiwNCiMgICApDQpgYGANCg0KYGBge3J9DQojIyBFeGFtaW5lIHBsb3Qgb2YgcC12YWx1ZXMgdG8gY29tcGFyZSBwIHZhbHVlLCBhZGp1c3RlZCBwIHZhbHVlLCBhbmQgd2VpZ2h0ZWQgcCB2YWx1ZSAoQ3JlYXRlZCBiIGluZGVwZW5kZW50IGh5cG90aGVzaXMgdGVzdGluZy4gU2VlIGFib3ZlLikNCnZpcmlkaXNwYWwzIDwtIHZpcmlkaXMobj0zKQ0KaGlzdChyZXMuQ0QxMDN2c0NENDlhREYkcHZhbHVlLCBicmVha3M9NTAsIGNvbD0iIzQ0MDE1NEZGIikNCmhpc3QocmVzLkNEMTAzdnNEUERGJHB2YWx1ZSwgYnJlYWtzPTUwLCBjb2w9IiM0NDAxNTRGRiIpDQpoaXN0KHJlcy5DRDEwM3ZzRE5ERiRwdmFsdWUsIGJyZWFrcz01MCwgY29sPSIjNDQwMTU0RkYiKQ0KaGlzdChyZXMuQ0Q0OWF2c0RQREYkcHZhbHVlLCBicmVha3M9NTAsIGNvbD0iIzQ0MDE1NEZGIikNCmhpc3QocmVzLkNENDlhdnNETkRGJHB2YWx1ZSwgYnJlYWtzPTUwLCBjb2w9IiM0NDAxNTRGRiIpDQpoaXN0KHJlcy5EUHZzRE5ERiRwdmFsdWUsIGJyZWFrcz01MCwgY29sPSIjNDQwMTU0RkYiKQ0KDQpoaXN0KHJlcy5DRDEwM3ZzQ0Q0OWFERiRwYWRqLCBicmVha3M9NTAsIGNvbD0iIzIxOTA4Q0ZGIikNCmhpc3QocmVzLkNEMTAzdnNEUERGJHBhZGosIGJyZWFrcz01MCwgY29sPSIjMjE5MDhDRkYiKQ0KaGlzdChyZXMuQ0QxMDN2c0ROREYkcGFkaiwgYnJlYWtzPTUwLCBjb2w9IiMyMTkwOENGRiIpDQpoaXN0KHJlcy5DRDQ5YXZzRFBERiRwYWRqLCBicmVha3M9NTAsIGNvbD0iIzIxOTA4Q0ZGIikNCmhpc3QocmVzLkNENDlhdnNETkRGJHBhZGosIGJyZWFrcz01MCwgY29sPSIjMjE5MDhDRkYiKQ0KaGlzdChyZXMuRFB2c0ROREYkcGFkaiwgYnJlYWtzPTUwLCBjb2w9IiMyMTkwOENGRiIpDQoNCmhpc3QoaWh3LnJlcy5DRDEwM3ZzQ0Q0OWEuYWxsJHdlaWdodGVkX3B2YWx1ZSwgYnJlYWtzPTUwLCBjb2w9IiNGREU3MjVGRiIpDQpoaXN0KGlody5yZXMuQ0QxMDN2c0RQLmFsbCR3ZWlnaHRlZF9wdmFsdWUsIGJyZWFrcz01MCwgY29sPSIjRkRFNzI1RkYiKQ0KaGlzdChpaHcucmVzLkNEMTAzdnNETi5hbGwkd2VpZ2h0ZWRfcHZhbHVlLCBicmVha3M9NTAsIGNvbD0iI0ZERTcyNUZGIikNCmhpc3QoaWh3LnJlcy5DRDQ5YXZzRFAuYWxsJHdlaWdodGVkX3B2YWx1ZSwgYnJlYWtzPTUwLCBjb2w9IiNGREU3MjVGRiIpDQpoaXN0KGlody5yZXMuQ0Q0OWF2c0ROLmFsbCR3ZWlnaHRlZF9wdmFsdWUsIGJyZWFrcz01MCwgY29sPSIjRkRFNzI1RkYiKQ0KaGlzdChpaHcucmVzLkRQdnNETi5hbGwkd2VpZ2h0ZWRfcHZhbHVlLCBicmVha3M9NTAsIGNvbD0iI0ZERTcyNUZGIikNCmBgYA0KDQpgYGB7cn0NCiNzZXNzaW9uaW5mbw0Kc2Vzc2lvbkluZm8oKQ0KYGBgDQoNCmBgYHtyfQ0KI2NpdGF0aW9ucywgdXNpbmcgYSBtZXRob2QgYXMgZGVzY3JpYmVkIGluIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI3NTM1NjI4L2hvdy1kby1pLXRlbGwtd2hpY2gtci1wYWNrYWdlcy10by1jaXRlLWluLW15LXBhcGVyIA0KcGFja2FnZXNfaW5fdXNlIDwtIGMoIHNlc3Npb25JbmZvKCkkYmFzZVBrZ3MsIG5hbWVzKCBzZXNzaW9uSW5mbygpJGxvYWRlZE9ubHkgKSApDQp0aGVfY2l0YXRpb25zX2xpc3QgPC0gbGFwcGx5KCBYPXBhY2thZ2VzX2luX3VzZSwgRlVOPWNpdGF0aW9uKQ0KdGhlX2NpdGF0aW9uc19saXN0DQoNCnNpbmsoZmlsZT0ndGhlX2NpdGF0aW9uX2xpc3QudHh0JykNCnRoZV9jaXRhdGlvbnNfbGlzdA0Kc2luayhmaWxlPU5VTEwpDQpgYGANCg0KYGBge3J9DQojRklODQpgYGANCg0K